1 链接:https://www.nowcoder.com/questionTerminal/8ee967e43c2c4ec193b040ea7fbb10b8
2 来源:牛客网
3
4 public class Solution {
5 //从n的2进制形式的最右边开始判断是不是1
6 /*
7 * 该解法如果输入时负数会陷入死循环,
8 * 因为负数右移时,在最高位补得是1
9 * 二本题最终目的是求1的个数,那么会有无数个
10 * 1了。
11 */
12 //-------------可能陷入死循环的解法---------------------
13 public static int NumberOf1_CanNotUse(int n) {
14 int count = 0;
15 while (n != 0) {
16 /*
17 * 用1和n进行位与运算,
18 * 结果要是为1则n的2进制形式
19 * 最右边那位肯定是1,否则为0
20 */
21 if ((n & 1) == 1) {
22 count++;
23 }
24 //把n的2进制形式往右推一位
25 n = n >> 1;
26 }
27 return count;
28 }
29 //---------------正解--------------------------------
30 //思想:用1(1自身左移运算,其实后来就不是1了)和n的每位进行位与,来判断1的个数
31 private static int NumberOf1_low(int n) {
32 int count = 0;
33 int flag = 1;
34 while (flag != 0) {
35 if ((n & flag) != 0) {
36 count++;
37 }
38 flag = flag << 1;
39 }
40 return count;
41 }
42 //--------------------最优解----------------------------
43 public static int NumberOf1(int n) {
44 int count = 0;
45 while (n != 0) {
46 ++count;
47 n = (n - 1) & n;
48 }
49 return count;
50 }
51 public static void main(String[] args) {
52 //使用n=10,二进制形式为1010,则1的个数为2;
53 int n = -10;
54 System.out.println(n + "的二进制中1的个数:" + NumberOf1(n));
55 }
56 }