海明碼(也叫漢明碼)具備一位糾錯能力。本文以1010110這個二進制數爲例解釋海明碼的編碼和校驗方法。編碼
編碼spa
肯定校驗碼的位數xtable
設數據有n位,校驗碼有x位。則校驗碼一共有2x種取值方式。其中須要一種取值方式表示數據正確,剩下2x-1種取值方式表示有一位數據出錯。由於編碼後的二進制串有n+x位,所以x應該知足二進制
2x-1 ≥ n+x
方法
使不等式成立的x的最小值就是校驗碼的位數。在本例中,n=7,解得x=4。數據
肯定校驗碼的位置tab
校驗碼在二進制串中的位置爲2的整數冪。剩下的位置爲數據。如圖所示。co
位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
內容 | x1 | x2 | 1 | x3 | 0 | 1 | 0 | x4 | 1 | 1 | 0 |
求出校驗位的值ab
以求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。