下面的代码对于第一次见到的人来说简直莫名其妙,我来试着讲一下他的思路。
就好像每个地方干部,他们分别掌握自己当地的信息,那么中央如何统计这些信息呢?
首先地方干部先向上级领导汇报自己的信息,再由上级领导将信息汇集,这样信息一层层汇总,最终可以将所有地方的信息统计起来。
对于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; } };