【Python应用】二进制加减

 目录

程序说明

实现效果

完整代码


欢迎关注 【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()

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值