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


import math

# ---------- Задание 1 ----------
print("=== Задание 1 ===")
p = [0.6, 0.2, 0.1, 0.1]
H = -sum(x * math.log2(x) for x in p)
print(f"H = {H:.4f} бит")

# ---------- Задание 2 ----------
print("\n=== Задание 2 ===")
msg = "AAABBAAC"
fixed = {"A": "00", "B": "01", "C": "10"}
var = {"A": "0", "B": "10", "C": "11"}
enc_f = "".join(fixed[c] for c in msg)
enc_v = "".join(var[c] for c in msg)
print("Фиксированный код:", enc_f, "| длина:", len(enc_f))
print("Переменный код:   ", enc_v, "| длина:", len(enc_v))
saved = len(enc_f) - len(enc_v)
print(f"Экономия: {saved} бит ({saved / len(enc_f) * 100:.1f}%)")

# ---------- Задание 3 ----------
print("\n=== Задание 3 ===")
data = [int(c) for c in "1010"]
d1, d2, d3, d4 = data
# позиции: 1=p1, 2=p2, 3=d1, 4=p3, 5=d2, 6=d3, 7=d4
p1 = d1 ^ d2 ^ d4
p2 = d1 ^ d3 ^ d4
p3 = d2 ^ d3 ^ d4
code = [p1, p2, d1, p3, d2, d3, d4]
print("Кодовое слово:      ", "".join(map(str, code)))

err_pos = 1
recv = code.copy()
recv[err_pos - 1] ^= 1
print("С ошибкой (бит 1):  ", "".join(map(str, recv)))

s1 = recv[0] ^ recv[2] ^ recv[4] ^ recv[6]
s2 = recv[1] ^ recv[2] ^ recv[5] ^ recv[6]
s3 = recv[3] ^ recv[4] ^ recv[5] ^ recv[6]
syndrome = s3 * 4 + s2 * 2 + s1
print(f"Синдром: {s3}{s2}{s1} -> позиция ошибки: {syndrome}")
if syndrome:
    recv[syndrome - 1] ^= 1
print("Исправленное слово: ", "".join(map(str, recv)))
extracted = [recv[2], recv[4], recv[5], recv[6]]
print("Извлечённые данные: ", "".join(map(str, extracted)))
print("Совпадает с исходным:", extracted == data)

# ---------- Задание 4 ----------
print("\n=== Задание 4 ===")
N = 8
num = -73
mag = abs(num)
sign_mag = (1 << (N - 1)) | mag           # прямой код
ones = ((1 << N) - 1) ^ mag               # обратный: инверсия положительного
twos = (ones + 1) & ((1 << N) - 1)        # дополнительный
b = lambda x: format(x, f"0{N}b")
print("Прямой код:         ", b(sign_mag))
print("Обратный код:       ", b(ones))
print("Дополнительный код: ", b(twos))


def from_sign_mag(x):
    m = x & ((1 << (N - 1)) - 1)
    return -m if x >> (N - 1) else m


def from_ones(x):
    if x >> (N - 1):
        return -(((1 << N) - 1) ^ x)
    return x


def from_twos(x):
    return x - (1 << N) if x >> (N - 1) else x


r1, r2, r3 = from_sign_mag(sign_mag), from_ones(ones), from_twos(twos)
print("Восстановлено:", r1, r2, r3)
print("Корректно:", r1 == r2 == r3 == num)

# ---------- Задание 5 ----------
print("\n=== Задание 5 ===")
x = 6.35
W = 16
results = []
for f in (2, 4, 6, 8):
    scaled = x * (1 << f)
    q = round(scaled)
    code16 = format(q & ((1 << W) - 1), f"0{W}b")
    restored = q / (1 << f)
    err = abs(x - restored)
    results.append((f, err))
    print(f"f={f}: x*2^f={scaled:.2f} -> {q}; код={code16[:W - f]}.{code16[W - f:]}; "
          f"значение={restored:.8f}; погрешность={err:.8f}")
best = min(results, key=lambda t: t[1])
print(f"Наименьшая погрешность при {best[0]} дробных битах ({best[1]:.8f})")