//巧妙计算一个数二进制表示法中1的位数。
int fun(unsigned int n)
{
n=(n&0x55555555)+((n>>1)&0x55555555);
n=(n&0x33333333)+((n>>2)&0x33333333);
n=(n&0x0f0f0f0f)+((n>>4)&0x0f0f0f0f);
n=(n&0x00ff00ff)+((n>>8)&0x00ff00ff);
n=(n&0x0000ffff)+((n>>16)&0x0000ffff);
return n;
}
以217(11011001)为例,有图有真相,下面的图足以说明一切了。217的二进制表示中有5个1 :
//另一种做法
int fun(unsigned int n)
{
int val=0;
int i;
for(i=0;i<8;i++)
{
val+=x&0x01010101;
x>>=1;
}
val+=(val>>16);
val+=(val>>8);
return val&0xff;
}