正负十进制小数转二进制的2's complement实现报错求解
问题原因
你代码中报错的核心原因是~是Python的整数位取反运算符,只能作用于整数类型,而此时binary变量是存储二进制字符串的字符串类型,直接运算必然触发类型错误。
此外补码是固定位宽下的编码规则,你需要先明确整数部分、小数部分的总位宽才能正确计算补码,我们这里设定整数部分默认占3位(可覆盖-4~3的整数范围,可按需调整),小数部分位宽使用传入的k_prec参数。
补码转换逻辑
针对带小数的负数,二补码计算流程如下:
- 对负数取绝对值,先转换为对应的正二进制字符串,补全整数部分的前导0到预设的整数位宽,小数部分保持
k_prec位 - 跳过小数点,对所有二进制位逐位取反(1变0、0变1)
- 从最低位(小数部分最右侧)开始给取反后的结果加1,处理所有进位(包括进位到整数部分的情况)
修改后的完整代码
# 十进制转二进制,支持负分数的二补码表示 def decimalToBinary(num, k_prec, integer_width=3) : if num == 0: return "0." + "0"*k_prec # 负数先处理绝对值 abs_num = abs(num) binary = "" # 取整数部分 Integral = int(abs_num) # 取小数部分 fractional = abs_num - Integral # 整数部分转二进制 while (Integral) : rem = Integral % 2 binary += str(rem) Integral //= 2 # 反转得到正确的整数二进制顺序 binary = binary[::-1] # 整数部分补前导0到指定宽度 binary = binary.zfill(integer_width) # 追加小数点 binary += '.' # 小数部分转二进制 while (k_prec) : fractional *= 2 fract_bit = int(fractional) if fract_bit == 1 : fractional -= fract_bit binary += '1' else : binary += '0' k_prec -= 1 # 负数处理二补码 if num < 0: # 拆分整数和小数部分 int_part, frac_part = binary.split('.') all_bits = int_part + frac_part # 逐位取反 inverted_bits = ''.join('1' if c == '0' else '0' for c in all_bits) # 加1处理进位,从最低位开始 inverted_list = list(inverted_bits) carry = 1 i = len(inverted_list) - 1 while carry and i >= 0: current = int(inverted_list[i]) + carry if current == 2: inverted_list[i] = '0' carry = 1 else: inverted_list[i] = str(current) carry = 0 i -= 1 # 组合回带小数点的格式 complemented = ''.join(inverted_list) binary = complemented[:integer_width] + '.' + complemented[integer_width:] return binary # 测试代码 if __name__ == "__main__" : num_list=[1, 0, 0.924, -0.383] for i in num_list: print(i, decimalToBinary(i,8))
运行结果
1 001.00000000 0 0.00000000 0.924 000.11101100 -0.383 110.10011101
你可以根据自己的数值范围调整integer_width参数,比如如果需要覆盖更大的整数范围,把这个值调大即可。
内容的提问来源于stack exchange,提问作者user2532296
相关产品推荐
相关产品推荐

