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

自定义Python位或(|)函数前三位比特未翻转,与内置函数结果不符

位或程序前三位比特错误的排查与修复

问题描述

我写了一个实现**位或(|)**功能的Python程序,运行无报错,但前三位比特无法正确翻转,其余功能正常。反复检查代码修复了诸多问题,这个bug始终无法解决,代码逻辑看似无误但结果不符合预期。

测试代码与结果

执行以下测试代码:

print(bitor(11101010100101, 10111010))
print(bin(0b11101010100101 | 0b10111010))

得到结果:

0b11101010111010
0b11101010111111

与Python内置位或结果对比,仅前三位存在差异。

问题代码片段

def bitor(x, y):
    bit1 = list(str(x))
    bit2 = list(str(y))
    lenchk = False
    result = []
    count = 0
    l1 = len(bit1) - 1
    l2 = len(bit2) - 1
    # 检查哪个比特序列更长,以便后续无法对比时切换至更长的序列
    if l1 > l2:
        lenchk = True
    elif l1 < l2:
        lenchk = False
    # 根据检查结果确定更长的序列,从末尾索引开始对比比特,根据是否为1或全0来追加0或1
    if lenchk:
        for _ in bit2:
            print(bit1[l1], bit2[l2])
            if bit1[l1] and bit2[l2] == "0":
                result.append("0")
                l2 -= 1
                l1 -= 1
                count += 1
            elif bit1[l1] or bit2[l2] == "1":
                result.append("1")
                l2 -= 1
                l1 -= 1
                count += 1
            elif count >= len(bit2):
                break
        # 当较短的比特序列遍历完成后,继续处理较长的序列
        while l1 >= 0:
            if bit1[l1] == "1":
                result.append("1")
                l1 -= 1
            elif bit1[l1] == "0":
                result.append("0")
                l1 -= 1
    # 若第二个比特序列更长,执行与上述相同的逻辑
    elif lenchk is False:
        for _ in bit1:
            if bit2[l2] and bit1[l1] == "0":
                result.append("0")
                l2 -= 1
                l1 -= 1
                count += 1
            elif bit2[l2] or bit1[l1] == "1":
                result.append("1")
                l2 -= 1
                l1 -= 1
                count += 1
            elif count >= len(bit1):
                break
        while l2 >= 0:
            if bit2[l2] == "1":
                result.append("1")
                l2 -= 1
            elif bit2[l2] == "0":
                result.append("0")
                l2 -= 1
    # 反转结果比特序列并转换为字符串,得到最终结果
    result.reverse()
    result = ''.join(map(str, result))
    return "0b" + result

错误原因分析

  1. 逻辑判断条件错误:
    • 原代码中bit1[l1] and bit2[l2] == "0" 写法错误,实际逻辑是“只要bit1[l1]非空(即任何比特值)且bit2[l2]是0”就追加0,但位或的正确逻辑是只有当两个比特都为0时才输出0,正确写法应为bit1[l1] == "0" and bit2[l2] == "0"。
    • 同理,bit1[l1] or bit2[l2] == "1" 逻辑错误,原写法只要bit1[l1]非空就会触发这个条件,正确逻辑是只要其中一个比特为1就输出1,应为bit1[l1] == "1" or bit2[l2] == "1"。
  2. 无效的循环终止条件:for循环中的elif count >= len(bit2): break 永远不会触发,因为循环次数等于len(bit2),循环结束时count才等于该值,此条件可删除。

修复后的代码

def bitor(x, y):
    bit1 = list(str(x))
    bit2 = list(str(y))
    lenchk = False
    result = []
    l1 = len(bit1) - 1
    l2 = len(bit2) - 1
    
    if l1 > l2:
        lenchk = True
    elif l1 < l2:
        lenchk = False
    
    if lenchk:
        # 遍历较短的bit2序列
        while l2 >= 0:
            # 位或核心逻辑:双0才输出0,否则1
            if bit1[l1] == "0" and bit2[l2] == "0":
                result.append("0")
            else:
                result.append("1")
            l2 -= 1
            l1 -= 1
        # 处理bit1剩余的高位比特
        while l1 >= 0:
            result.append(bit1[l1])
            l1 -= 1
    else:
        # 遍历较短的bit1序列
        while l1 >= 0:
            if bit1[l1] == "0" and bit2[l2] == "0":
                result.append("0")
            else:
                result.append("1")
            l2 -= 1
            l1 -= 1
        # 处理bit2剩余的高位比特
        while l2 >= 0:
            result.append(bit2[l2])
            l2 -= 1
    
    result.reverse()
    return "0b" + ''.join(result)

验证结果

运行原测试代码,现在输出与Python内置位或功能完全一致:

0b11101010111111
0b11101010111111

内容的提问来源于stack exchange,提问作者NecroG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:57:56