naive的方法就是一位一位的统计了,但是通过一个为运算的技巧,我们可以快速的求解这个问题。
(1)不妨假设这个数不超过64位,利用下面代码for循环里面的计算,可以并行的求解8个字节的位数和。
(2)接下来将val分布在8字节的和加起来 注意这里采用对半相加的办法,非常巧妙.最后的结果一定保存在最低字节里面。
(3) 经过测试这个比naive的办法可能要快了一倍左右。
def count(x):
val =
for i in range():
val += x&
x>>=
val += val>>
val += val>>
val += val>>
print(val&)