第一次接觸:海明校驗碼很難!後端
第二次接觸:海明校驗碼仍是很難!spa
第三次接觸:海明校驗碼很難? Say no.net
第四次接觸:海明校驗碼除了步驟多一點,其實並不難 對象
海明校驗碼定義blog
海明碼(Hamming Code)是利用奇偶性來檢錯和糾錯的校驗方法。海明碼的構成方法是在數據位之間的肯定位置插入k個校驗位,經過擴大碼距來實現檢錯和糾錯。對於數據位m的數據,加入k位的校驗碼,它應知足:m+k+1<2^kci
揭開海明校驗碼神祕面紗get
因運算步驟較多,採用栗子的方式一步一步求解,更易於理解。博客
栗子1:table
求信息1011的海明碼方法
第一步:求校驗碼的位數值K
根據公式 2^k >= m+k +1 ,信息1011的長度m=4, 2^k >= k+5 , -->k=3 ;
第二步:求校驗碼的位置 海明校驗碼方法中,校驗碼的位置是固定的,從2^0位,2^1 位 --> 2^2位 ... 2^n位 ,總個數爲K位
校驗碼的位置在第1位、第2位、第4位,分別用R一、R二、R3表示;
第三步:畫圖表
註釋: 我分別把七個位置用1~7來表示了 在填寫信息爲的時候也要把高位的數據填到高的位置 ,例如1011 就要相似圖中的填法
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
信息碼 | 1 | 1 | 0 | 1 | |||
校驗碼 | R1 | R2 | R3 |
第四步:計算校驗位的值,也是最爲關鍵的一步 。
肯定校驗位的分組原則:每一個位數都由R一、R二、R3中的一或若干個所肯定。
說明:1由第一位R1來校驗;2由第二位R2來校驗;因爲3=1+2(1和2指的是位數,都是2的n次方)因此3由第一位R1和第二位R2校驗,4由第四位R3校驗,5和3道理是同樣的,5=1+4(2^0+2^2);6=2+4;7=1+2+4來校驗,一次類推;
畫表以下所示:
海明碼位置 | 佔用的校驗位號 | 備註 |
1 | 1 | R1 |
2 | 2 | R2 |
3 | 1,2 | R1,R2 |
4 | 4 | R3 |
5 | 1,4 | R1,R3 |
6 | 2,4 | R2,R3 |
7 | 1,2,4 | R1,R2,R3 |
第四步:進行彙總,看每一個校驗位都肯定了哪一位。
R1:一、三、五、7
R2:二、三、六、7
R3: 四、五、六、7
第五步:用亦或運算求出R一、R二、R3的值:(以R1爲例)
普及:參加運算的兩個對象,若是兩個相應位爲「異」(值不一樣),則該位結果爲1,不然爲0。多個異或運算時,從左至右依次異或
第二行是對應的信息位上的數,如圖求出R1=1
以此類推,求出值表以下
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
信息碼 | 1 | 1 | 0 | 1 | |||
校驗碼 | 1 | 0 | 0 |
第五步第二種求法:
有此圖的數據位置關係求值;
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
信息碼 | 1 | 1 | 0 | 1 | |||
校驗碼 | R1 | R2 | R3 |
以R1爲例: R1校驗了1,3,5,7這四個位置,而這4個位置對應的值分別爲 空、一、一、1,對着幾個值 「異或運算」得1,即
R1校驗的結果 1⊕1⊕1 = 1
R2校驗的結果 1⊕0⊕1 = 0
R3校驗的結果 1⊕0⊕1 = 0
以此類推,求出值表以下
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
信息碼 | 1 | 1 | 0 | 1 | |||
校驗碼 | 1 | 0 | 0 |
第六步:讀數
從位置1到7依次讀出:1010101
完畢!很簡單吧 -_-
思惟拓展
接收端如何檢驗和糾錯呢
假設 信息傳輸前 1010101–>傳輸後 1000101
解析:
從1000101 獲取到的信息碼 是1001;校驗碼是 100 ;
求解1001的海明碼,這裏不累贅求解過程了,獲得的 海明碼是 :
由上面的第四步,肯定
R1校驗 一、三、五、7
R2校驗 二、三、六、7
R3校驗 四、五、六、7
傳輸後端的數據 1000101 ,⊕表示異或運算
R1校驗的結果 1⊕0⊕1 = 0
R2校驗的結果 1⊕0⊕1 = 0
R3校驗的結果 0⊕0⊕1 = 1
即校驗位R1~R3 爲 001 ;
001 不等於 100 因此傳輸過程當中數據出了問題 (檢錯)
開始糾錯:
求出的校驗位值和得到的校驗位值異或運算 100⊕001,獲得 101
101 即對應哪一個位置的值出錯了, 2^2 + 2^0 = 5;
接收的數據 1000101 第5個位置出錯了,與以前的假設吻合,將出錯的值取反,即獲得正確的值
全部正確的值爲 1010101
一波很6的海明校驗碼操做!謝謝觀看 !
在此很是感謝下面的這位博主,寫的很好,一看就懂了,很是感謝!!