You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:44:17