问题:实现一个函数,统计输入数字中一的个数

原理:

如果你知道位运算中的一个特点,这道题就简单了。

数字666的二进制形式是1010011010,注意到(666-1)的二进制为1010011000,观察发现,就是666消去了一个数字1。那么666在消去一个数字1后剩下的部分可以通过位运算留下:666&(666-1)。利用这种特性,添加一个计数器,计算每次消去数字和保留剩下部分的次数。该次数就是我们需要的结果。

实现:

1
2
3
4
5
6
def number_of_one(n):
counter = 0
while n:
counter += 1
n = (n-1) & n
return counter

测试:

1
2
3
4
5
6
import random

def main():
for _ in range(10):
n = random.randint(1, 100)
print(n, bin(n), number_of_one(n), sep='-->')