问答题 如何求解整型数的二进制表示中1的个数
【正确答案】
【答案解析】求解整型数的二进制表示中1的个数有以下两种方法:
方法一,程序代码如下:
#include<stdio.h>
int func(int x)
{
int countx=0;
while(x)
{
countx ++;
x=x&(x-1);
}
return countx;
}
int main()
{
printf("%d/n",func(9999));
return 0;
}
程序输出结果:
8
在上例中,函数func()的功能是将x转化为二进制数,然后计算该二进制数中含有的1的个数。首先以9为例来分析,9的二进制为1001,8的二进制为1000,两者执行&操作之后结果为1000,此时1000再与0111(7的二进制位)执行&操作之后结果为0。
为了理解这个算法的核心,需要理解以下两个操作:
1)当一个数被减1时,它最右边的那个值为1的bit将变为0,同时其右边的所有的bit都会变成1。
2)“&=”,位与并赋值操作。去掉已经被计数过的1,并将该值重新设置给n。这个算法循环的次数是bit位为1的个数。也就说,有几个bit为1,循环几次,对bit为1比较稀疏的数来说,性能很好。例如,0x10000000循环一次就可以。
方法二,判断每个数的二进制表示中每一位是否为1,如果为1,就在count上加1,而循环的次数是常数,即n的位数。但该方法有一个缺陷,就是在1比较稀疏的时候效率会比较低。
程序示例如下:
#include<stdio.h>
int func (unsigned int n)
{
int count=0;
while(n)
{
count+=n & 0xlu;
n>>=1;
}
return count;
}
int main()
{
printf("%d/n",func(9999));
return 0;
}
程序输出结果:
8
需要注意的是,上例中,0xlu表示的是十六进制的无符号数1。