【海明碼】(容易看懂)

轉載自:http://www.cnblogs.com/scrutable/p/6052127.htmlhtml

海明碼(也叫漢明碼)具備一位糾錯能力。本文以1010110這個二進制數爲例解釋海明碼的編碼和校驗方法。網絡

  編碼學習

  肯定校驗碼的位數x編碼

  設數據有n位,校驗碼有x位。則校驗碼一共有2x種取值方式。其中須要一種取值方式表示數據正確,剩下2x-1種取值方式表示有一位數據出錯。由於編碼後的二進制串有n+x位,所以x應該知足spa

2x-1 ≥ n+x   htm

  使不等式成立的x的最小值就是校驗碼的位數。在本例中,n=7,解得x=4。blog

  肯定校驗碼的位置遊戲

  校驗碼在二進制串中的位置爲2的整數冪。剩下的位置爲數據。如圖所示。get

位置 1 2 3 4 5 6 7 8 9 10 11
內容 x1 x2 1 x3 0 1 0 x4 1 1 0

 

  求出校驗位的值table

  以求x2的值爲例。爲了直觀,將表格中的位置用二進制表示。

位置 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011
內容 x1 x2 1 x3 0 1 0 x4 1 1 0

  爲了求出x2,要使全部位置的第二位是1的數據(即形如**1*的位置的數據)的異或值爲0。即x2^1^1^0^1^0 = 0。所以x2 = 1。

  同理可得x1 = 0, x3 = 1, x4 = 0。

位置 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011
內容 0 1 1 1 0 1 0 0 1 1 0

 

  所以1010110的海明碼爲01110100110。

  校驗

  假設位置爲1011的數據由0變成了1,校驗過程爲:

  將全部位置形如***1, **1*, *1**, 1***的數據分別異或。

  ***1: 0^1^0^0^1^1 = 1

  **1*: 1^1^1^0^1^1 = 1

  *1**: 1^0^1^0 = 0 

  1***: 0^1^1^1 = 1

  以上四組中,若是一組異或值爲1,說明該組中有數據出錯了。***1 **1* 1***的異或都爲1,說明出錯數據的位置爲1011。

海明碼簡單分析

 

肯定校驗位個數

 

海明碼的碼組長度須要符合:2^r – 1 (r表明校驗位個數)

爲何是這個公式呢?由於:只有這樣才能保證校驗位足夠覆蓋整個須要校驗的碼組。

好比說:校驗位有3位,那就是2^3 = 8 – 1 = 7 這樣就能夠校驗長度爲7的碼組,若是按實際來講,也就是信息位 4 位,校驗碼 3 位。

經過上面分析,咱們知道校驗位 r 加上信息位 k 就等於 2^r – 1 , 這也就是爲何書上有 k + r <= 2^r – 1 的緣由,下面是一些 R 和 K的關係表

信息碼位數 1 2~4 5~11 12~26 27~57 58~120
校驗碼位數 2 3 4 5 6 7

注:表中數據取自網絡

肯定校驗位的位置

知道了須要多少位校驗碼,還須要知道把校驗碼放在哪一個位置上才行,這個只要記住,信息位在非2n的位置上,而校驗位是在2n的位置上就能夠了,條件再嚴格點就是,書上說的信息位所在海明碼中的下標是須要等於前面幾個校驗組的下標,看到這裏不懂沒有關係,下面進行簡單的例題分析。

舉個粟(例)子:

信息字碼組 : 1101 , 這時候信息位 k = 4 , 根據 k + r <= 2^r – 1 ,得出 r = 3 , 那就按書上說的,用P一、P二、P3來表示這3位校驗碼,這時候咱們就來作填字格遊戲。

P1 P2 1 P3 1 0 1

位置就這麼簡單的肯定下來了,若是位數更多的話也是同樣的,校驗位就是在 一、二、四、八、16…….這些位置上。

計算校驗位 Pi

上面已經知道要在什麼位置插入校驗碼,如今就差下鍋的料了,怎麼求校驗位實際的值呢?很簡單!

根據海明碼定義,是經過將信息進行分組,才得以實現檢錯和糾錯的能力,就像一開始的圖,每個Pi都會包含3個信息位。

問題來了,那我怎麼知道這些信息位是哪幾個?仍是書上的定義……

重點

好比說信息 1 1 0 1 ,從上面填字格遊戲咱們能夠看出,被分別安排在 H3,H5,H6,H7的位置(這些位置怎麼來的?7位數從1到7給每位編號嘛!)

則:H3 = H1+H2 (這裏是等式右邊下標相加等於等式左邊下標的意思,下面同樣)

H5 = H1+H4

H6 = H2 + H4

H7 = H1 + H2 + H4

經過上面的關係式,咱們能夠看出,右邊在海明碼中的數位,正好都是校驗碼的位置,下面來正式求校驗碼了。

P1(H1) = H3 ⊕ H5 ⊕ H7 (⊕表示異或)

P2(H2) = H3 ⊕ H6 ⊕ H7

P3(H4) = H5 ⊕ H6 ⊕ H7

大功告成!啥?還要我算出來?打字很累的,手短打字又慢,行吧行吧,想在之前本身學海明碼,怎麼看都不會的份上,可能也是本身太笨…….

信息碼:1101 對應海明位 H三、H五、H六、H7,不要把海明碼,校驗位,信息位搞混了哦!雖然我也是常常弄混哈哈!

P1 = 1 ⊕ 1 ⊕ 1 = 1;

P2 = 1 ⊕ 0 ⊕ 1 = 0;

P3 = 1 ⊕ 0 ⊕ 1 = 0;

啥?異或不懂?不要緊,我也常常不懂,相同 = 0 ,不一樣 = 1,異表示不一樣,按或的規則,是否是好奇葩!

好了,如今咱們能夠完成填字遊戲了 P1 P2 1 P3 1 0 1 ==> 1010101,這就是咱們最後須要獲得的海明碼,終於完成了!

還沒完呢……有了這個海明碼還須要知道怎麼校驗有沒有出錯啊,簡單簡單,跟我繼續來學習!

海明碼糾錯和檢錯

有了上面的校驗碼和信息碼,咱們就能借用他們去知道怎麼檢查,信息在傳送的過程當中有沒有發生錯誤,廢話很少說,下面開始,仍是書上的定義,由於校驗碼有三位,咱們這裏再申明三位碼分別用S一、S二、S3表示,知足下列關係:

S1 = P1 ⊕ H3 ⊕ H5 ⊕ H7 ;

S2 = P2 ⊕ H3 ⊕ H6 ⊕ H7;

S3 = P3 ⊕ H5 ⊕ H6 ⊕ H7;

這樣求出來的S一、S二、S3若是都爲0就是沒有出錯,若是不是0就表示在海明碼中出錯的位置,將其取反就能夠起到糾錯的功能了。很簡單吧,等等,爲何是上面的關係式?哪來的?能夠往上看看求校驗碼那裏,這就是分組的結果,這裏我就偷懶下不算了,大家能夠本身算算,真的結束了……

相關文章
相關標籤/搜索