Загрузка данных


def direct(number: int, bits: int) -> str:
    sign = "1" if number < 0 else "0"
    magnitude = abs(number)
    return sign + format(magnitude, f"0{bits - 1}b")

def inverse(number: int, bits: int) -> str:
    code = direct(number, bits)
    if number >= 0:
        return code
    return "1" + "".join("1" if b == "0" else "0" for b in code[1:])

def twos_complement(number: int, bits: int) -> str:
    if number >= 0:
        return direct(number, bits)
    return format(int(inverse(number, bits), 2) + 1, f"0{bits}b")

def from_twos_complement(code: str) -> int:
    value = int(code, 2)
    if code[0] == "1":
        value -= 2 ** len(code)
    return value

def num(positive: bool | None = None) -> (int, int):
    if positive is True:
        number = int(input("Введите пол. число: "))
        if number < 0: raise ValueError("Число должно быть положительным")
    elif positive is False:
        number = int(input("Введите отр. число: "))
        if number >= 0: raise ValueError("Число должно быть отрицательным")
    else:
        number = int(input("Введите число: "))
    bits = int(input("Введите разрядность: "))
    return number, bits

def task1():
    number, bits = num(positive=True)
    print(direct(number, bits)) # 13 (8) -> 00001101

def task2():
    number, bits = num(positive=False)
    print(direct(number, bits)) # -13 (8) -> 10001101

def task3():
    number, bits = num(positive=False)
    print(inverse(number, bits)) # -13 (8) -> 11110010

def task4():
    number, bits = num(positive=False)
    print(twos_complement(number, bits)) # -13 (8) -> 11110011

def task5():
    number, bits = num(positive=False)
    print(f"Прямой код: {direct(number, bits)}")
    print(f"Обратный код: {inverse(number, bits)}")
    print(f"Дополнительный код: {twos_complement(number, bits)}")

def task6():
    number, bits = num()
    print(f"Прямой код: {direct(number, bits)}")
    print(f"Обратный код: {inverse(number, bits)}")
    print(f"Дополнительный код: {twos_complement(number, bits)}")

def task7():
    base = int(input("Введите число: "))

    summand = int(input("Введите пол. число: "))
    if summand < 0: raise ValueError("Число должно быть положительным")

    total = base + summand

    bits = int(input("Введите разрядность: "))
    base_code = twos_complement(base, bits)
    summand_code = twos_complement(summand, bits)
    total_code = twos_complement(total, bits)

    base_restored = from_twos_complement(base_code)
    summand_restored = from_twos_complement(summand_code)
    total_restored = (base_restored + summand_restored) % (2 ** bits)

    print(f"Сложение {base_code} + {summand_code} = {format(total_restored, f"0{bits}b")}")
    print(f"Восстановленная сумма {from_twos_complement(total_code)} == {total_restored}")

def task8():
    bits = int(input("Введите разрядность: "))
    print(f"{-2 ** (bits - 1)} .. {2 ** (bits - 1) - 1}")

match int(input("Номер задания: ")):
    case 1:
        task1()
    case 2:
        task2()
    case 3:
        task3()
    case 4:
        task4()
    case 5:
        task5()
    case 6:
        task6()
    case 7:
        task7()
    case 8:
        task8()