海明码搞懂之前先了解奇偶校验。例如:1111 对其进行奇偶校验。
奇检验:11111 奇校验使1的个数保持在奇数
偶校验:01111 偶校验使1的个数保持在偶数
海明码可以拆分为三步:
一、确定校验的位数
公式:2^k >= k + n + 1
人话:2^k >= k + 数据位数 + 1 其中k就是有多少个校验位
如:100011 的校验位有: 2^k >= k + 6 + 1 ==> 2^4 >= 4 + 6 + 1 有4位校验位(100011有6位,二进制1248 8>6 )
二、确定校验数的位置
还是:100011为例 校验码的位置为:Pi 在海明位号为 2^(i-1) i为校验位4
原有的信息位:D6 D5 D4 D3 D2 D1
校验位:P4 P3 P2 P1
原有位数+校验位数=H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
D6 D5 P4 D4 D3 D2 P3 D1 P2 P1
海明码为:10?001?1??
三、放入校验规则
H3 = H1+H2 | P1 P2 |
H5 = H1+H4 | P1 P4 |
H6 = H2 + H4 | P2 P3 |
H7 = H1 + H2 + H4 | P1 P2 P3 |
H9 = H1 + H8 | |
P1 P4 | |
H10 = H2 + H8 | P2 P4 |
H10 H9 H7 H6 H5 H3
1 0 0 0 1 1
然后把包含有P1的取出来做异或⊕
P1 = H3 ⊕H5 ⊕H7 ⊕H9= 1 ⊕ 1 ⊕0 ⊕ 0= 0
然后把包含有P2的取出来做异或⊕
P2 = H3 ⊕H6 ⊕H7 ⊕H10= 1 ⊕ 0 ⊕0 ⊕1= 0
然后把包含有P3的取出来做异或⊕
P3 = H6 ⊕H7 = 0 ⊕ 0= 0
然后把包含有P4的取出来做异或⊕
P4 = H5 ⊕H9 ⊕H10 = 1 ⊕ 0 ⊕1= 0
将算出的值放入到 D6 D5 P4 D4 D3 D2 P3 D1 P2 P1 得到海明码 1000010100