海明碼學習前提
學習海明碼之前,我們要約定3個原則:
- 海明碼只能檢測出2位錯,糾1位錯(因此不要問如果3位錯怎么辦等幼稚問題)。
- 海明碼默認進行偶校驗(除非特殊說明使用奇校驗)。
- 海明碼是一串由0和1組成的序列(除01外沒有其他的值,記住了!這是重點)
如果下面有任何無法理解的問題,反復看上面三個原則,下面再也不贅述。
前提:奇偶校驗
奇校驗:這串序列1的個數如果為偶數則在前面加個1,使1的個數變成奇數,否則加0。
偶校驗:這串序列1的個數如果為奇數則在前面加個1,使1的個數變成偶數,否則加0。
例子:1111
奇校驗就是 11111
偶校驗就是 01111
1110
奇校驗就是 01110
偶校驗就是 11110
特性是檢測一位錯,無法糾錯。
概述:海明碼的構成
例如如下序列:1100
我們想要讓其變成海明碼只需如下操作
1.算出校驗位數k
正常情況下我們需要如下此操作:
2^k >= k + 數據位數 + 1
這里等於3
2.確定校驗位在海明碼中的位置
這里按2^k次冪留出來,就像1,2,4,8,16,32。(如果問有5位等其他煩人的數據位怎么辦后面我會說,先按4位數做)
H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|
1 | 1 | 0 | 0 |
3.分組(重點,很多人蒙圈就在此)
我們需要確認H1,H2,H4這三個校驗位都來校驗哪些位置。
我們按這個規則進行分配。
將1,2,4(海明碼下標為1,2,4)
的二進制碼寫出來,並且最高位補到3位(前面算的K數)
如下所示:
1 | 2 | 4 |
---|---|---|
001 | 010 | 100 |
然后我們將0替換為*,作為通配表。
1 | 2 | 4 |
---|---|---|
**1 | *1* | 1** |
我們將1到7的二進制序列,列出來如下表
7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|
111 | 110 | 101 | 100 | 011 | 010 | 001 |
!!!重點!!!!
我們將7->1依次與上面的通配表進行匹配
1 | 2 | 4 |
---|---|---|
**1 | *1* | 1** |
001(1) | 010(2) | 100(4) |
011(3) | 011(3) | 101(5) |
101(5) | 110(6) | 110(6) |
111(7) | 111(7) | 111(7) |
因此我們可以確定
H1 負責 1 3 5 7 位數的校驗
H2 負責 2 3 6 7 位數的校驗
H4 負責 4 5 6 7 位數的校驗
4.求出校驗位是0還是1
因為上面我們得出以下結論:
H1 負責 1 3 5 7 位數的校驗
H2 負責 2 3 6 7 位數的校驗
H4 負責 4 5 6 7 位數的校驗
那 根據
H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | |||
這張表,我們根據偶校驗很容易就求出以下結論: | ||||||
H3,H5,H7 1的個數為奇數 因此H1=1 | ||||||
H3,H6,H7 1的個數為偶數 因此H2=0 | ||||||
H5,H6,H7 1的個數為偶數 因此H4=0 | ||||||
至此我們得出了完整的漢明碼 |
H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 0 | 0 | 1 |
5.查錯
查錯比較簡單,如果以下三組
既
H1,H3,H5,H7
或者
H2,H3,H6,H7
或者
H4,H5,H6,H7
偶校驗出錯,則出錯。
比方說 如果 H1,H3,H5,H7由1100 變成了 1110 (1的個數為偶數)就是出錯了
這里該不贅述
6.糾錯
首先我們先理解以下為什么海明碼能糾錯。
首先我們先畫個圓。然后按如下形式做交叉
在每個相鄰部位,我們做相加處理
變成了如下形式
當我們如果發現偶校驗出錯,
比方說在 1 3 7 5 這個區域出錯。
如果這個位置出錯了,那么一定是 1 3 7 5 這四個位置中的一個位置出錯(如果倆位出錯則無法糾錯,這個點一定要記住)
如果此時其他的倆個組 即:2,3,6,7 和 4,5,6,7偶校驗都通過了的話。
也就證明只可能是1出錯
所以我們可以將 1 的位數 做修改。如果是0變為1,如果是1變為。來達到糾錯的目的。
但是如果2,3,5,7這個位置也出錯了,4,5,6,7這個位置沒有出錯。
我們很容易就推導出,是 3 這個位置出錯了。
我們就可以修改3的值,如果是0變為1或者如果是1變為0.
在此時我們會發現一個巧妙的規則!
當我們把1,3,5,7 設為P1,
2,3,6,7設為P2
4,5,6,7設為P3時
當如果哪組校驗失敗就為1
P3 | P2 | P1 | 出錯(第幾)位數 |
---|---|---|---|
0 | 0 | 1 | 1 |
0 | 1 | 0 | 2 |
0 | 1 | 1 | 3 |
1 | 0 | 0 | 4 |
1 | 0 | 1 | 5 |
1 | 1 | 0 | 6 |
1 | 1 | 1 | 7 |
剛好是對應的二進制編碼。就是這么絕。
其實學完海明碼之后,我真的覺得人家實在是太聰明了。
5位數數據
至此,其實如果認真看上面的部分,大家已經可以理解海明碼是如何實現的了。
但是我還是再帶大家寫一次。這種5位數的。關鍵在於如何分組!!!!!
比方說10001
先求出校驗位數:
2 ^ k > = k + 5 + 1
則 k = 4
畫出表格
將1,2,4,8位置空出來,再將數據位填進去
H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 1 |
分組(*為通配符)
8 | 4 | 2 | 1 |
---|---|---|---|
1*** | *1** | **1* | ***1 |
8,9 | 4,5,6,7 | 2,3,6,7 | 1,3,5,7,9 |
偶校驗每個分組得出結果
H9 | H8 | H7 | H6 | H5 | H4 | H3 | H2 | H1 |
---|---|---|---|---|---|---|---|---|
1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
總結
如果還有人不懂,請仔仔細細跟着我走一遍。本人保證此思路是絕對正確的。