题目描述:对于一个字节(8位)的无符号整型变量,二进制表示中“1”的个数,要求算法的执行效率尽可能高。
- 方法一
思路:首先比较好的方法是想到对二进制数进行 >>和&,这样就可以逐步求出序列中“1”的个数.(注:1&1=1, 1&0=0, 0&0=0)
int Count(int num)
{
int count = 0;
while (num)
{
count += (num & 0x01 );
num >>= 1;
}
return count;
}
- 方法二
思路:对于一个二进制数,第一次除以2,原来数会减少一个0,如果有余,那么表示当前位置有个1。
例如:1010 0010
第一次除以2,商1010001,余数0;
第二次除以2,商101000 ,余数1。
int Count(int num)
{
int count = 0;
while (num)
{
if (num % 2 == 1)
count++;
num /= 2; //同num >>= 1;
}
return count;
}
- 方法三
思路:位操作效率比除、余操作高,第三种也是一种巧妙方法。
int Count(int num)
{
int count = 0;
while (num)
{
num &= (num - 1);
count++;
}
return count;
}
- 测试代码
int main()
{
int i = 9;
int N = 0;
N = Count(i);
printf("%d\n", N);
return 0;
}