如何用布尔逻辑实现任意二进制数转十进制(无分支/函数)
问题解决方案
你的代码存在两个核心问题:
- 索引越界:当输入的二进制数长度不足7位时,尝试访问
number_str[-5]这类超出字符串长度的索引会报错; - 权重对应错误:你当前的代码是从右往左取字符计算权重,和任务要求的“左到右对应128至1”的规则相反,导致结果偏差。
修复后的代码(简洁版)
number = 1010111 # 替换为你的输入 number_str = str(number).rjust(8, '0') # 补前导零至8位,避免索引错误 decimal = ( int(number_str[0]) * 128 + int(number_str[1]) * 64 + int(number_str[2]) * 32 + int(number_str[3]) * 16 + int(number_str[4]) * 8 + int(number_str[5]) * 4 + int(number_str[6]) * 2 + int(number_str[7]) * 1 ) print(decimal)
代码说明
- 补零处理:
rjust(8, '0')将二进制字符串补前导零至固定8位,比如输入1101会转为"00001101",输入1010111转为"01010111",确保每个权重对应的位置都有字符,彻底解决索引越界问题; - 权重匹配:严格按照任务要求,从左到右(字符串索引0到7)依次对应128、64、32、16、8、4、2、1的权重,计算结果完全符合预期。
无字符串方法版本(严格遵循无函数要求)
如果rjust被视为函数调用不符合要求,可以手动拼接零:
number = 1010111 number_str = str(number) # 手动生成前导零并拼接 padded_str = '0000000'[:8 - len(number_str)] + number_str decimal = ( int(padded_str[0]) * 128 + int(padded_str[1]) * 64 + int(padded_str[2]) * 32 + int(padded_str[3]) * 16 + int(padded_str[4]) * 8 + int(padded_str[5]) * 4 + int(padded_str[6]) * 2 + int(padded_str[7]) * 1 ) print(decimal)
内容的提问来源于stack exchange,提问作者XYZ
相关产品推荐
相关产品推荐

