海明码:奇偶校验码的一种扩充。只能检验和恢复一位。
例如:
求1011 的海明码?
答案:1010101
其中 :红色所在位数 1,2,4,8,... 为计算出的验证码,
黑色的信息为原信息码:1011。
计算方法:
1.先计算需要几位海明码?
1011 是四位 ,
它有四种只错一位的情况,(0011,1111,1001,1010)
再加上x位海明码的错一位情况。
再加上一种全部位都正确的情况。
所以海明码需要 x+4+1 中可能。
所以需要海明码x位可以表示出 x+4+1 中可能。
即: x+4+1 <=2**x (2**x 表示2的x方),计算得到3,
海明码最少是3,当然4,5,6位都可以,就像用101 校验 和0101 00101 000101 00000000101 都能校验一样,只是比较浪费。
所以计算出了海明码的位数为3。(其实也就是往原编码内填充1,2,4,8,16,这些地方,填完为止。)
2. 开始计算。
1011 中间插入三位验证码
位数 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
信息 | 1 | 0 | 1 | x | 1 | x | x |
在第7位:
7=2**2+2**1+2**0=4+2+1
6 对应位置为0,不算在内。
5=2**2 +2**0 = 4 +1
3=2**1+2**0 =2+1
这样得到
(2**0) 出现三次,所以在最低位 为1 ,(出现偶数次就是0,奇数次就是1,)(原计算方法是用异或计算 1 xor 1 =0 , 1xor 0 =1 , 0 xor 0=0 ,这里结果都一样)
(2**1)出现两次,所以第二位是0,
(2**2)出现两次,所以第三位是0,
所以就得到
位数 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
信息 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
3.验证和举例
我们传输这个得到的海明码 ,和一个错误的海明码:
正确的验证 1010101 :
1.得到海明码(1,2,4 位,如果更长的话就是8,16,32。。。位)001。
2.信息码为剩下的 1011,同步骤二:计算得到001,
3.和上面的到的海明码001 异或 (001 xor 001 ) =000,正确
错误的验证 1110101 :
1.得到海明码 001。
2.信息码1111 ,计算:
7=2**2+2**1+2**0=4+2+1
6=2**2+2**1 =4+2
5=2**2 +2**0 = 4 +1
3=2**1+2**0 =2+1 (2**0)出现3次,(2**1)出现3次,(2**2)出现3次。 得到海明码:111
3.和上面的到的海明码001异或(111 xor 001)=110 =6 代表是第六位出错,也即是1110101 改为1010101。最后再重申一下:
海明码是只能验证和恢复一位,两位三位同时错的话是无效的。