Hamming (7,4) kodu 1950'ye kadar uzanır. O zamanlar Richard Hamming, Bell Laboratuarlarında matematikçi olarak çalıştı. Her Cuma Hamming, hesaplama makinelerini bir dizi hesaplama yapmak için ayarladı ve sonuçları bir sonraki Pazartesi günü topladı. Eşlik denetimlerini kullanarak, bu makineler hesaplama sırasında hataları algılayabildi. Sinir bozucu, çok sık hata mesajları aldığı için Hamming, hata tespitini geliştirmeye karar verdi ve ünlü Hamming kodlarını keşfetti.
Hamming Mekaniği (7,4)
Hamming kodlarının amacı, bir veri bitindeki veya bir eşlik bitindeki tek bitlik bir hata (bir bit çevrilir) saptanabilecek ve düzeltilebilecek şekilde bir dizi eşlik biti oluşturmaktır. Yalnızca birden çok hata oluşursa, Hamming kodu orijinal verileri kurtaramaz. Hiç bir hata fark etmeyebilir, hatta yanlış düzeltebilir. Bu nedenle, bu mücadelede sadece tek bitli hatalarla ilgileneceğiz.
Hamming kodlarına bir örnek olarak Hamming (7,4) koduna bakacağız. 4 bit veriye ek olarak , aşağıdaki denklemler kullanılarak hesaplanan d1, d2, d3, d4
3 parite bitini kullanır p1, p2, p3
:
p1 = (d1 + d2 + d4) % 2
p2 = (d1 + d3 + d4) % 2
p3 = (d2 + d3 + d4) % 2
Sonuçta elde edilen kod sözcüğü (veri + eşlik bitleri) biçimindedir p1 p2 d1 p3 d2 d3 d4
.
Bir hatayı tespit etmek şu şekilde çalışır. Parite bitlerini yeniden hesaplar ve alınan parite bitleriyle eşleşip eşleşmediğini kontrol edersiniz. Aşağıdaki tabloda, tek bitlik hataların her çeşidinin eşlik bitleriyle farklı bir eşleşme sağladığını görebilirsiniz. Bu nedenle, her bir tek bit hatası yerelleştirilebilir ve düzeltilebilir.
error in bit | p1 | p2 | d1 | p3 | d2 | d3 | d4 | no error
-------------|---------------------------------------------
p1 matches | no | yes| no | yes| no | yes| no | yes
p2 matches | yes| no | no | yes| yes| no | no | yes
p3 matches | yes| yes| yes| no | no | no | no | yes
Misal
Verileriniz olsun 1011
. Eşlik biti p1 = 1 + 0 + 1 = 0
, p2 = 1 + 1 + 1 = 1
ve p3 = 0 + 1 + 1 = 0
. Verileri ve eşlik bitlerini birleştirdiğinizde kod kelimesini alırsınız 0110011
.
data bits | 1 011
parity bits | 01 0
--------------------
codeword | 0110011
Bir iletim veya hesaplama sırasında 6. bitin (= 3. veri biti) ters çevrildiğini söyleyelim. Kelimeyi alırsınız 0110001
. İddia edilen veriler 1001
. Yine eşitlik bitlerini hesaplamak p1 = 1 + 0 + 1 = 0
, p2 = 1 + 0 + 1 = 0
, p3 = 0 + 0 + 1 = 1
. Yalnızca p1
kod kelimesinin eşlik bitleriyle eşleşir 0110001
. Bu nedenle bir hata oluştu. Yukarıdaki tabloya bakarak, hatanın meydana geldiğini d3
ve orijinal verileri kurtarabileceğinizi söyler 1011
.
Meydan okuma:
Bir sözcük (7 bit) alan bir işlev veya program yazın, bitlerden biri yanlış olabilir ve orijinal verileri kurtarın. Girdi (STDIN, komut satırı bağımsız değişkeni, bilgi istemi veya işlev bağımsız değişkeni aracılığıyla) biçimi, bir dize "0110001"
, bir liste veya [0, 1, 1, 0, 0, 0, 1]
MSB'de bir dizi veya bir tam sayı olabilir 0b0110001 = 49
. Yukarıda açıklandığı gibi, girdinin sırası p1 p2 d1 p3 d2 d3 d4
. Çıktı (dönüş değeri veya STDOUT aracılığıyla) aynı formatta, ancak sırayla olmalıdır d1 d2 d3 d4
. Yalnızca 4 veri bitini döndürün / çıkarın.
Bu kod golfü. Bu nedenle en kısa kod kazanır.
Test senaryoları:
1110000 -> 1000 # no error
1100000 -> 1000 # error at 1st data bit
1111011 -> 1111 # error at 2nd data bit
0110001 -> 1011 # error at 3rd data bit (example)
1011011 -> 1010 # error at 4th data bit
0101001 -> 0001 # error at 1st parity bit
1010000 -> 1000 # error at 2nd parity bit
0100010 -> 0010 # error at 3rd parity bit
[is_p3_wrong][is_p2_wrong][is_p1_wrong]
tabanı alırsanız , sözcükteki yanlış bitin konumunu verir. (Söz konusu tabloya dayanarak.) Bu muhtemelen bazı algoritmalar için yararlı olacaktır.