我在一本书中找到了以下代码:
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.如果计数器移动到第二个字符,不会被计数两次吗?
答案 0 :(得分:3)
x&1
检查最右边的位是否为1
所以对于你的例子它会这样做:
1100 & 0001 # 0
0110 & 0001 # 0
0011 & 0001 # 1
0001 & 0001 # 1
并正确返回2.通过右移,您将从右到左计数位,直到最后一次移位导致0000
并打破循环
答案 1 :(得分:2)
1是0b0001。用0b1100对它进行AND运算得到0.没有任何重复计数。
答案 2 :(得分:0)
代码
num_bits += x&1
检查是否设置了最低有效位,如果设置为1则添加到num_bits。
x >>= 1
然后将数字右移一位,移出最低有效位。
最后,循环条件
while x:
检查数字中是否还有任何位,当最终设置位移出时,此检查失败。