其中一二的方法,参考了网上的 关于“计算一个字节里(byte)里面有多少bit被置1”的思考 这篇文章
第一种,移数据
int fun1(int data)
{
int count=0; //计数
while(data)
{
count+=data&1; //检查Num最后一位是否为1
data>>=1;
}
return count;
}
没什么可解释的,但如果是个负数,可能会出问题
第二种,移1
int fun2(int data)
{
int count=0;
int bit_1=1;
while(bit_1)
{
if(data&bit_1)count++;
bit_1<<=1;
}
return count;
}
虽然不会出现什么问题,但是效率没有第一种高
第三种,与上自己减一的数
int fun3(int data)
{
int count=0;
while(x)
{
count++;
x = x & (x - 1);
}
return count;
}
1000 - 1 = 0111,正好是原数取反;
所以用这种方法来求1的个数是很效率很高的,不懂的敲一敲代码,就能明白了
int main()
{
printf("fun1 = %d\n",fun1(9999)); //循环会执行14次
printf("fun2 = %d\n",fun2(9999)); //循环会执行32次
printf("fun3 = %d\n",fun3(9999)); //循环会执行8次
return 0;
}
一下就能看出那个效率高了,第一种还有可能会死在负数,第二种效率低,第三种效率高