x &= (x – 1)可以删除x中最右边值为1 的一个二进制位
x-1,其实就是把x最右端的1变为0,1左边的其余位不变。
如: x=7
// x= 111
//x-1 后 x = 110
// x & x-1 = 110, --- 第一次
// x再次减一,即x-1 后 x =101
// x & x-1 = 100 ----第二次
// x-1 后 x= 011
// x & x-1 = 000 ----第三次
如上,三个即把三个二进制的1消去。
利用此特性,即可统计其整型参数的值为1的二进制位的个数。
方法如下:
int bitcount(unsigned x)
{
int b;
for (b = 0; x != 0; x &= (x - 1))
b++;
return b;
}