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:
检查数字中是否仍有任何位设置,此检查失败,因为最后设置的位被移出。
我在一本书上找到了以下代码:
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:
检查数字中是否仍有任何位设置,此检查失败,因为最后设置的位被移出。