Python 2位操作问题:统计整数未置位的countbit函数失效原因
你的代码问题分析与修复方案
首先,你的代码存在两个关键问题,导致无法正确统计未置位(unset bits)的数量:
1. 运算符优先级错误
Python 中,加法运算符 + 的优先级高于按位与运算符 &,所以你写的 counter = counter + n&1 会被 Python 解析为 (counter + n) & 1,这完全偏离了你原本的意图——你想先计算 n&1(获取当前最低位的值),再累加到计数器中。
举个实际例子,当 n=5(二进制 101)时:
- 第一次循环:
counter + n等于0+5=5,5&1等于1,counter变为1 - 第二次循环
n=2:counter + n等于1+2=3,3&1等于1,counter还是1 - 第三次循环
n=1:counter + n等于1+1=2,2&1等于0,counter变为0
最终返回0,这显然是错误的。
修复这个问题很简单,给 n&1 加上括号,确保先执行按位与操作:
counter = counter + (n & 1) # 或者更简洁的写法: counter += (n & 1)
2. 逻辑与需求不符
你的代码当前统计的是置位(set bits,即二进制中1的数量),但你的需求是统计未置位(二进制中0的数量),所以逻辑完全反了。
修复方案一:统计置位数量后,用总有效位数减去它
对于正整数 n,我们可以用 n.bit_length() 获取它的二进制有效位数(即最高位1所在的位置),然后用总位数减去置位数量,得到未置位数量:
def count_unset_bits(n): if n == 0: # 特殊处理0:二进制全为0,这里按有效位返回1,若需固定位数(如32位)可改为对应数值 return 1 set_count = 0 temp = n while temp: set_count += (temp & 1) temp = temp >> 1 total_bits = n.bit_length() return total_bits - set_count print(count_unset_bits(5)) # 输出1,因为5的二进制是101,总3位,1个0
修复方案二:直接统计每一位的0
在循环中判断当前位是否为0,若是则计数器加1:
def count_unset_bits(n): counter = 0 if n == 0: return 1 temp = n while temp: if not (temp & 1): counter += 1 temp = temp >> 1 return counter print(count_unset_bits(5)) # 输出1
补充:处理固定位数的场景
如果你的需求是统计固定位数(比如32位整数)的未置位数量,那可以调整逻辑如下:
def count_unset_bits_32(n): # 统计32位无符号整数中的未置位数量 set_count = 0 temp = n & 0xFFFFFFFF # 确保是32位无符号整数 for _ in range(32): set_count += (temp & 1) temp = temp >> 1 return 32 - set_count print(count_unset_bits_32(5)) # 输出30,因为32位中只有2个1,剩下30个0
内容的提问来源于stack exchange,提问作者paiakshay998
相关产品推荐
相关产品推荐

