剑指Offer 二进制中一的个数

 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 }
View Code
原文地址:https://www.cnblogs.com/oscar-cnblogs/p/10772536.html