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})")