题解 | #二进制中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,&之后就会消去。