目录
欢迎关注 【Python应用】系列,持续更新中……
程序说明
定义了一个程序,能够接受用户输入的两个十进制数,并根据用户选择的操作(加法或减法)在二进制形式下进行计算。程序将十进制数转换为二进制,执行加减运算,然后将结果显示为二进制和十进制形式。
实现效果
完整代码
def decimal_to_binary(n, bits=8):
"""
将十进制数转换为二进制字符串,支持负数,并保留指定数量的位数。
"""
if n < 0:
n = (1 << bits) + n # 处理负数的情况
binary_format = f"{{:0{bits}b}}"
return binary_format.format(n)
def binary_to_decimal(binary_str):
"""
将二进制字符串转换为十进制数。正确处理补码表示的负数。
"""
if binary_str[0] == '1' and len(binary_str) == 8: # 如果是负数
return -1 * ((1 << len(binary_str)) - int(binary_str, 2))
else: # 如果是正数
return int(binary_str, 2)
def binary_addition(a, b, bits=8):
"""
执行二进制加法,并返回二进制字符串结果(包含符号位)。
"""
sum_decimal = int(a, 2) + int(b, 2) # 将二进制转换为十进制进行加法运算
max_bits = max(len(a), len(b), bits)
if sum_decimal >= 2**max_bits: # 检查并处理溢出
sum_decimal -= 2**max_bits
result_bits = max_bits if sum_decimal < 2**(max_bits - 1) else max_bits + 1
return decimal_to_binary(sum_decimal, result_bits)
def binary_subtraction(a, b, bits=8):
"""
执行二进制减法,并返回二进制字符串结果(包含符号位)。
"""
diff_decimal = binary_to_decimal(a) - binary_to_decimal(b) # 直接使用十进制进行减法运算
return decimal_to_binary(diff_decimal, bits)
def complement_of_two(binary_str):
"""
对二进制字符串的除符号位以外的部分取反加一,返回补码表示。
"""
# 去除符号位
no_sign_bit = binary_str[1:]
# 取反
inverted = ''.join('1' if b == '0' else '0' for b in no_sign_bit)
# 加一
inverted_decimal = int(inverted, 2) + 1
# 转换为二进制并保留原符号位
complement = binary_str[0] + decimal_to_binary(inverted_decimal, len(no_sign_bit))
# 处理可能的溢出情况
if len(complement) > len(binary_str):
complement = complement[1:]
return complement
def main():
while True:
try:
# 用户输入两个十进制数
num1 = int(input("请输入第一个十进制数: "))
num2 = int(input("请输入第二个十进制数: "))
# 选择操作符
operation = input("请输入操作(+ 或 -): ")
if operation.lower() == 'q':
print("程序已退出。")
break
# 将十进制数转换为二进制(默认为8位表示)
bits = 8 # 根据需要可以调整位数
num1_binary = decimal_to_binary(num1, bits)
num2_binary = decimal_to_binary(num2, bits)
# 打印转换结果
print(f"{num1} in binary is {num1_binary}")
print(f"{num2} in binary is {num2_binary}")
# 根据选择的操作执行加法或减法
if operation == '+':
result_binary = binary_addition(num1_binary, num2_binary, bits)
elif operation == '-':
result_binary = binary_subtraction(num1_binary, num2_binary, bits)
else:
raise ValueError("不支持的操作")
# 将二进制结果转换回十进制,同时考虑符号位
result_decimal = binary_to_decimal(result_binary) if operation == '-' else int(result_binary, 2)
if result_binary[0] == '1' and len(result_binary) > bits: # 正确处理负数
result_decimal -= 2**len(result_binary)
# 打印结果
operation_symbol = "+" if operation == '+' else "-"
print(f"{num1} {operation_symbol} {num2} 的二进制结果是 {result_binary},即 {result_decimal} 的十进制表示。")
# 如果结果是负数,额外输出除符号位以外取反加一的结果
if result_decimal < 0:
complement_result = complement_of_two(result_binary)
print(f"原码: {complement_result}")
except ValueError as e:
if str(e) == "invalid literal for int() with base 10: 'q'":
print("程序已退出。")
break
else:
print(f"发生错误:{e}")
if __name__ == "__main__":
main()