计算机基础:海明码是什么?

海明码:奇偶校验码的一种扩充。只能检验和恢复一位。

例如:
求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。
 
最后再重申一下:
海明码是只能验证和恢复一位,两位三位同时错的话是无效的。
 
原文地址:https://www.cnblogs.com/wanself/p/2701429.html