漢明碼實現原理
漢明碼(Hamming Code)是廣泛用於內存和磁盤糾錯的編碼。漢明碼不僅可以用來檢測轉移數據時發生的錯誤,還可以用來修正錯誤。(要注意的是,漢明碼只能發現和修正一位錯誤,對於兩位或者兩位以上的錯誤無法正確和發現)。
漢明碼的實現原則是在原來的數據的插入k位數據作為校驗位,把原來的N為數據變為m(m = n +k)位編碼。其中編碼時要滿足以下原則:
2 ^k - 1 >= m 其中(m = n + k)
這就是Hamming不等式,漢明碼規定,我們所得到的m位編碼的2^k ( k>=0 && 2^k < m)位上插入特殊的校驗碼,其余位把源碼按順序放置。
漢明碼的編碼規則如下:
- 在新的編碼的2^(k - 1)( k >= 0)位上填入0(即校驗位)
- 把新的編碼的其余位把源碼按原順序填入
- 校驗位的編碼方式為:第k位校驗碼從則從新的編碼的第2^(k - 1)位開始,每計算2^(k - 1)位的異或,跳2^(k - 1)位,再計算下一組2^(k - 1)位的異或,填入2^(k - 1)位,比如:
第1位校驗碼位於新的編碼的第1位(2 ^(1-1) == 1)(漢明碼從1位開始),計算1,3,5,7,9,11,13,15,...位的異或,填入新的編碼的第1位。
第2位校驗碼位於新的編碼的第2位(2 ^(2-1) == 2),計算2,3,6,7,10,11,14,15,...位的異或,填入新的編碼的第2位。
第3位校驗碼位於新的編碼的第4位(2 ^(3-1) == 4),計算4,5,6,7,12,13,14,15,20,21,22,23,...位的異或,填入新的編碼的第4位。
第4位校驗碼位於新的編碼的第8位(2 ^(4-1) == 8),計算8-15,24-31,40-47,...位的異或,填入新的編碼的第8位。
第5位校驗碼位於新的編碼的第16位(2 ^(5-1) == 16),計算16-31,48-63,80-95,...位的異或,填入新的編碼的第16位。
漢明碼編碼實例
以10101編碼為例,創建一個漢明碼編碼的空間,並且把源碼填入編碼的對應位中中,_ _ 1 _ 0 10 _ 1,並留出校驗碼位(校驗位先設為0)。(因為2^4 - 1>= 5+4 && 2^3 - 1 < 5+ 3所以需要4位校驗碼)
- 計算校驗碼的第1位(1,3,5,7,9進行異或): 結果為0,所以漢明碼第2^0位為0,結果為0 _ 1 _ 0 10 _ 1
- 計算校驗碼的第2位(2,3,6,7進行異或): 結果為0,所以漢明碼第2^1位為0,結果為001 _ 0 10 _ 1
- 計算校驗碼的第3位(4,5,6,7進行異或): 結果為1,所以漢明碼第2^2位為0,結果為0011 0 10 _ 1
- 計算校驗碼的第4位(8, 9進行異或): 結果為0,所以漢明碼第2^3位為1,結果為0011 0101 1
- 所以最終編碼為001101011.
漢明碼校驗錯誤實例
我們以上面的編碼為例,假設我們現在收到的編碼為001101001,我們可以發現漢明碼的第8位與原來的漢明碼001101011不同,那我們怎么找出這個第8位的錯誤編碼呢?
算法很簡單,我們只要在算漢明碼校驗位的算法的上再算一遍,就得到了漢明碼的校驗方法,比如計算001101001對應的2^k位。
1,3,5,7,9進行異或,得到0
2,3,6,7進行異或,得到0
4,5,6,7進行異或,得到0
8,9進行異或,得到1
我們把上述結果反着排列,得到1000,即十進制的8,根據漢明碼的校驗規則,編碼出錯的地方即在第8位,我們把第8位的0換成1,即可得原來的編碼001101011。
上述的例子是出現在2^k的校驗位上的,如果出現在非2^k位上,得到的結果也是一樣的,比如:
假設收到的編碼為001100011,即第6位出了錯誤,我們根據規則
1,3,5,7,9進行異或,得到0
2,3,6,7進行異或,得到1
4,5,6,7進行異或,得到1
8,9進行異或,得到0
我們把上述結果反着排列,得到0110,即十進制的6,根據漢明碼的校驗規則,編碼出錯的地方即在第6位,我們把第6位的0換成1,即可得原來的編碼001101011。