自定义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
错误原因分析
- 逻辑判断条件错误:
- 原代码中
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"。
- 原代码中
- 无效的循环终止条件: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
相关产品推荐
相关产品推荐

