int func(x)
{
int countx = 0;
while (x)
{
countx ++;
x = x & (x - 1);
}
return countx;
}
假定x = 9999
答案是8
x&(x-1) 求的是二进制中1的个数
x|(x+1) 求的是二进制中0的个数
先把9999换成16进制,然后在转换成二进制,求二进制中1个个数。9999 = (270F) 16 = (0010 0111 0000 1111) 2 总共8个1。
0010011100001111 & 0010011100001110 = 0010011100001110
0010011100001110 & 0010011100001101 = 0010011100001100
0010011100001100 & 0010011100001011 = 0010011100001000
0010011100001000 & 0010011100000111 = 0010011100000000
0010011100000000 & 0010011011111111 = 0010011000000000
0010011000000000 & 0010010111111111 = 0010010000000000
0010010000000000 & 0010001111111111 = 0010000000000000
0010000000000000 & 0001111111111111 = 0000000000000000