每天一道算法题(2)——求整数的2进制表示中1的个数
Solution1:整数往右移,与1按位与
不适用负数。因为负数的移位自动填补1,程序陷入死循环。
int NumberOf1_Solution1(int i) { int count = 0; while(i) { if(i & 1) count ++; i = i >> 1; } return count; }
Solution 2:1往左移,与数相与
注意flag定义为unsigned int
int NumberOf1_Solution2(int i) { int count = 0; unsigned int flag = 1; while(flag) { if(i & flag) count ++; flag = flag << 1; } return count; }
Solution3:取反规律
任意一个数减1,结果是二进制表示中,最后一个1及其之后位取反。
int NumberOf1_Solution3(int i) { int count = 0; while (i) { ++ count; i = (i - 1) & i; } return count; }
适用负数,但是负数实际计算的1的个数为其补码中1的个数。
引申:1.倘若n&(n-1)==0,则该数为2的整数幂结果。
2.n|(n+1)统计n中0的个数,如:
int fun(unsigned int x) { int n=0; while((x+1)) { n++; x=x|(x+1); } return n; }