int func(x)
{
int countx =0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}

解释下思路:

1.任何一个数字表示成2进制后,都可以用以下形式表示

[x]1[0]

其中1为最末尾的非0值(也就是1),[x]表示任意数字,[0]表示任意个0

2.当x - 1 时,其实是将最末尾的[x]1[0] - 1 变为了 [x]0[1]

[x]1[0]  & [x]0[1] == [x][0][0]

3.[x] 继续分解用1的方式分解.

4.循环1-3直到,整个2进制不在含有1.

所以统计的是数字在2进制中的个数.

05-02 09:40