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;
}