下面的代码对于第一次见到的人来说简直莫名其妙,我来试着讲一下他的思路。

就好像每个地方干部,他们分别掌握自己当地的信息,那么中央如何统计这些信息呢?
首先地方干部先向上级领导汇报自己的信息,再由上级领导将信息汇集,这样信息一层层汇总,最终可以将所有地方的信息统计起来。

对于n的每一个2进制位,如果是0,说明该位上有0个1,如果是1,说明该位上有1个1.
这就相当于有32个管理1个位的地方干部(我们把它叫做1级干部吧),他们知道自己管理的那个位上有几个1(0个或1个).
现在要汇总这32个1级干部的信息了,
一级干部的上级是2级干部,2级干部需要知道每两个位上有几个1,这样2级干部只需要收到两个1级干部的信息,再把他们相加即可。
2级干部继续向上汇报,他的上级是4级干部,要掌握的信息是连续4个位有几个1,显然一个4级干部管理两个2级干部,只需要将2个2级干部汇报的值相加即可。
4级干部再向上汇报是8级再向上是16级,再向上是32级,此时就知道连续32位上1的个数了,也就是求出了答案。

可以自己代一个数值到下面的代码,结合上面的思路,应该会理解这段代码了。

0xaaaaaaaa: 10101010101010101010101010101010
0x55555555: 01010101010101010101010101010101
0xcccccccc:  11001100110011001100110011001100
0x33333333: 00110011001100110011001100110011
0xF0F0F0F0: 11110000111100001111000011110000
0x0F0F0F0F: 00001111000011110000111100001111
...
class Solution {
public:
     int  NumberOf1(int n) {
         unsigned x = n;
         x = ((x & 0xaaaaaaaa) >> 1) + (0x55555555 & x);  //2级
         x = ((0xCCCCCCCC & x) >> 2) + (0x33333333 & x);  //4级
         x = ((0xF0F0F0F0 & x) >> 4) + (0x0F0F0F0F & x);  //8级
         x = ((0xFF00FF00 & x) >> 8) + (0x00FF00FF & x);  //16级
         x = ((0xFFFF0000 & x) >> 16) + (0x0000FFFF & x); //32级
         return x;
     }
};