求下面函数的返回值 假设x=9999
int fun(int x)
{
int countx=0;
while(x)
{
x=x&(x-1);
countx++;
}
return countx;
}
解答:
fun(x)返回x表示成二进制时“1”位的个数。
9999二进制为10011100001111,里面一共8个1,所以返回8.
以下所说x都为2进制表示。
每次执行循环体,x中最右边为“1”的位都会变成0.详细:
当x末位为1时,如10111,x-1=10110,两者按位与,最右边的1变成0,x变成10110,计数器自增,进入下次循环;
当x末位为0时,如110000,x-1=101111,这时原本为1的左起第二位已经变成0,但后面多出了很多1.现在两者再按位与一下,就消除了这些多余的1,得到100000
也就是说 x&(x-1)每次消除二进制里面的一个1