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()