剑指Offer 二进制中一的个数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }