Python 位运算

Python Bit-wise Operation

我在一本书上找到了以下代码:

def count_bits(x):
   num_bits = 0
   while x:
      num_bits += x&1
      x >>= 1
return num_bits

print(count_bits(12))

我不明白这一行 (num_bits += x&1)

假设我输入 12 (1100),第一个字符(“1”)被计算在内。但是然后右移,1100变成0110,如果计数器移动到第二个字符,1不就被数了两次吗?

1 是 0b0001。与 0b1100 进行 AND 运算结果为 0。永远不会有任何重复计数。

x&1 检查最右边的位是否为 1

因此对于您的示例,它会做:

1100 & 0001 # 0
0110 & 0001 # 0
0011 & 0001 # 1
0001 & 0001 # 1

并且正确 return 2. 通过右移,您从右到左计算位数,直到最后一次移位导致 0000 并中断循环

代码

num_bits += x&1

检查是否设置了最低有效位,如果设置了,则将 1 添加到 num_bits。

x >>= 1

然后将数字右移一位,移出最低有效位。

最后,循环条件

while x:

检查数字中是否仍有任何位设置,此检查失败,因为最后设置的位被移出。