位运算AND代码异常:输出固定布尔数组,求错误排查
问题描述
完成代码挑战:从用户处获取两个0-255的数字,执行按位与(bitwise AND)操作,以8位二进制形式输出两个输入值及运算结果。
代码逻辑说明:
- 用布尔值代表二进制位,例如
[True, False, False, False, False, False, False, False]对应10000000 produce_string函数:将十进制数转换为二进制布尔数组write_string函数:将布尔数组转换为"1"和"0"组成的字符串,例如[False, False, False, True]应转为"0001"
遇到的问题:无论输入什么数值,打印结果始终是布尔形式的[ True False False False False False False False],而非预期的二进制字符串(如"1000110"),排查produce_string函数后仍无进展。
错误代码
import math import numpy as np a, b, n = 0, 0, 0 abool = np.array([0,0,0,0,0,0,0,0], dtype=bool) bbool = np.array([0,0,0,0,0,0,0,0], dtype=bool) cbool = np.array([0,0,0,0,0,0,0,0], dtype=bool) booleanString = np.array([0,0,0,0,0,0,0,0], dtype=bool) def produce_string(x): for i in range(0,7): if x % 2 == 1: booleanString[n] = True else: booleanString[n] = False x = math.trunc(x/2) def write_string(booleanString): for i in range(0, 7): if booleanString[7-n]: booleanString[n] = '1' else: booleanString[n] = '1' return booleanString a = int(input("First value (between 0 and 255): ")) b = int(input("Second value (between 0 and 255): ")) produce_string(a) abool = booleanString produce_string(b) bbool = booleanString for i in range(0,7): cbool[n] = abool[n] and bbool[n] print("First value: ", write_string(abool)) print("Second value: ", write_string(bbool)) print("First value AND second value: ", write_string(cbool))
问题根源
- 全局变量
n未更新:所有数组操作都在修改booleanString[n],但n始终是初始值0,导致只有数组第一个元素被修改,其余位保持初始False。 - 数组引用赋值:
abool = booleanString是引用传递,不是拷贝,调用produce_string(b)会直接覆盖abool的内容,最终abool和bbool指向同一个数组。 write_string逻辑混乱:循环只处理7位,且无论布尔值是True还是False都赋值为'1',同时直接修改布尔数组的类型(从bool转为str),还错误使用未更新的n索引。- 按位与计算不全:循环仅修改
cbool[n](索引0的位置),其余位未参与运算。
修复后的代码
import numpy as np def produce_binary_array(x): # 创建独立的布尔数组,避免全局变量污染 arr = np.zeros(8, dtype=bool) for i in range(8): # 从最低位到最高位计算,i=0对应2^0位(数组最后一位) arr[7 - i] = (x % 2 == 1) x = x // 2 return arr def bool_array_to_string(arr): # 将布尔数组转为二进制字符串,True对应'1',False对应'0' return ''.join(['1' if bit else '0' for bit in arr]) # 获取用户输入 a = int(input("第一个值(0-255):")) b = int(input("第二个值(0-255):")) # 转换为二进制布尔数组 abool = produce_binary_array(a) bbool = produce_binary_array(b) # 执行按位与运算 cbool = abool & bbool # 输出结果 print(f"第一个值:{bool_array_to_string(abool)}") print(f"第二个值:{bool_array_to_string(bbool)}") print(f"按位与结果:{bool_array_to_string(cbool)}")
修复说明
- 移除全局变量,每个函数生成独立数组,避免引用冲突和数据覆盖
- 修正循环逻辑,遍历8位所有位置,正确计算每一位的二进制值
bool_array_to_string用列表推导式实现类型转换,逻辑清晰且避免类型错误- 利用numpy原生的按位与运算符
&,高效完成数组级别的运算 - 输入提示和输出格式改为中文,更符合使用习惯
内容的提问来源于stack exchange,提问作者retrq
相关产品推荐
相关产品推荐

