不适用负数。因为负数的移位自动填补1,程序陷入死循环。
[cpp] view plain copy int NumberOf1_Solution1(int i) { int count = 0; while(i) { if(i & 1) count ++; i = i >> 1; } return count; }
注意flag定义为unsigned int
[cpp] view plain copy int NumberOf1_Solution2(int i) { int count = 0; unsigned int flag = 1; while(flag) { if(i & flag) count ++; flag = flag << 1; } return count; }
任意一个数减1,结果是二进制表示中,最后一个1及其之后位取反。
[cpp] view plain copy int NumberOf1_Solution3(int i) { int count = 0; while (i) { ++ count; i = (i - 1) & i; } return count; } 适用负数,但是负数实际计算的1的个数为其补码中1的个数。