牛客链接
题目
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
解题思路
如果一个数 -1 ,二进制中的表示为最右边的一个1变为0,后面的所有0变为1。
例如12(1100)减去1,则变为11(1011),转变过程为:
1100 -> 1000(先将最右边的1变为0) -> 1011(再将后面的0变为1)
此时将当前的值,与减去1后的值按位与(1100&1011) 就得到了1000(相当于已经计算了一个1,让count++) 重复上述步骤 直到最后的值为0即可。
代码实现
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while(n!=0) {
count++;
n = n&(n-1);
}
return count;
}
}