海明碼


海明碼學習前提

學習海明碼之前,我們要約定3個原則:

  1. 海明碼只能檢測出2位錯,糾1位錯(因此不要問如果3位錯怎么辦等幼稚問題)。
  2. 海明碼默認進行偶校驗(除非特殊說明使用奇校驗)。
  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

總結

如果還有人不懂,請仔仔細細跟着我走一遍。本人保證此思路是絕對正確的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM