题解 | #二进制中1的个数#
二进制中1的个数
http://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8
这种问题,第一反应将其转化为二进制,计算1的个数(n%2),但是无法处理负数,因为负数用的补码。
那么第二种就是位运算,这里存在一个问题,整数从左移位还是从右移位,如果是正数,那两边移位都可以,但是负数情况有些特殊,负数是补码。建议用1一次左移位去判断,给定数二进制位是否为1。
以上就是自己的想法:
代码:
class Solution {
public:
int NumberOf1(int n) {
int m = 1,l = 0,sum = 0;
while(l<32){
if((n&m) != 0)
sum++;
m <<= 1;
l++;
}
return sum;
}
};后看了题解,发现还有技巧:
int val; // input data
int ans = 0;
while (val != 0) {
++ans;
val = val & (val-1);
}巧妙在每次减一,再进行&操作,就会消去一位1。因为每次减1,那么二进制中若存在1,那么一定有一个1会变为0,&之后就会消去。

查看11道真题和解析