کد همینگ (۷،۴)
به ۴ بیت داده ۳ بیت توازن اضافه میکند طوری که اگر یک بیت در راه خراب شود، «نشانگر» دقیقاً جای آن را بگوید و درستش کند.
در کد همینگ (۷،۴) موقعیتهای ۱، ۲ و ۴ (توانهای ۲) بیت توازناند و بقیه داده:
ادامهی توضیح ↓- زمان:
O(1) - حافظه:
O(1) - گریمالدی، فصل ۱۶
دادهی 1011؛ کلمهی کد 0110011 است. بیت ۵ در راه خراب میشود و نشانگر دقیقاً ۵ را نشان میدهد.
def hamming(data, error):# Positions 1 … 7 hold p1 p2 d1 p3 d2 d3 d4; c[k - 1] is the bit at position k.d = [int(b) for b in data]c = [0, 0, d[0], 0, d[1], d[2], d[3]]table = [["p1", "p2", "d1", "p3", "d2", "d3", "d4"], c]c[0] = c[2] ^ c[4] ^ c[6]c[1] = c[2] ^ c[5] ^ c[6]c[3] = c[4] ^ c[5] ^ c[6]sent = "".join(str(b) for b in c)if error:c[error - 1] = c[error - 1] ^ 1# Each check covers the positions whose number has that bit set; together they spell the bad position.s1 = c[0] ^ c[2] ^ c[4] ^ c[6]s2 = c[1] ^ c[2] ^ c[5] ^ c[6]s4 = c[3] ^ c[4] ^ c[5] ^ c[6]syndrome = s1 + 2 * s2 + 4 * s4if syndrome:c[syndrome - 1] = c[syndrome - 1] ^ 1decoded = f"{c[2]}{c[4]}{c[5]}{c[6]}"return decoded
شروع اجرا
0123
1011
sent—
syndrome—
decoded—
جدول هنوز خالی است.
متغیرهای محلی
data'1011'
error5
نارنجی = در همین گام عوض شد
Call stack
- hamming()خط 1
گام ۱ از ۱۸
توضیح
ایده
در کد همینگ (۷،۴) موقعیتهای ۱، ۲ و ۴ (توانهای ۲) بیت توازناند و بقیه داده:
p1موقعیتهایی را بررسی میکند که بیت ۱ شمارهشان یک است: ۱، ۳، ۵، ۷.p2موقعیتهای ۲، ۳، ۶، ۷.p4موقعیتهای ۴، ۵، ۶، ۷.
تشخیص و تصحیح
گیرنده هر سه بررسی را دوباره حساب میکند. اگر بیت موقعیت k خراب شده باشد، دقیقاً بررسیهایی ناموفق میشوند که k را پوشش میدهند، یعنی بیتهای شمارهی k. پس عدد دودویی بررسیهای ناموفق (نشانگر) همان k است و بیت را برمیگردانیم. نشانگر صفر یعنی خطایی نیست.
این کد هر خطای تکبیتی را درست میکند ولی دو خطا را نه.
در trace به چه چیزی نگاه کنی
- جدول نام هر موقعیت و بیتش را نشان میدهد؛ ببین کدام بیت خراب و دوباره درست میشود.