如果出这道题目给你,你会怎么做?
大部分会很快的写错代码:
int getCount(int n)
{
int num=0;
while (n)
{
if (n & (n-1))
++num;
n>>=1;
}
return num;
}
如果这样写,肯定不行,只考虑了正数,如果是负数呢?如0x8000 0000呢,会陷入死循环的,负数右移高位填充1,最后变成了0xffff ffff。
改进:可以用了临时变量flag。我们不对n做移位操作。
int getCount(int n)
{
int num=0;
int flag = 1;
while (flag)
{
if (n & flag)
{
++num;
}
flag <<= 1;
}
return num;
}
这样的话,通过左移flag,然后与n相与,可以得到n的二进制中1个个数。
如果不能使用辅助变量呢?
继续改进:
由于n可能为负数,我们不能进行右移操作。
上程序:
int getCount(int n)
{
int num=0;
int flag = 1;
while(n)
{
++num;
n = n & (n-1);
}
return num;
}