海明校验码经常考试当中会考到海明码是个难点。首先需要了解海明码编码的规则,如何编码和计算多少位信息位需要多少个校验位。


一个经过海明码编码完成之后那些是位置是校验位那些是信息位。在这种编码体系当中明确规定了校验位的位置,是位于整个信息编码完成的的这个信息编码的当中的2的n次方的位置。

如:

2的0次方    也就是第一位 是校验位。  

2的1次方    也就是第二位 是校验位。  

2的2次方   也就是第四位 是校验位。

也就是海明码把校验位的位置给定死了。固定后就可以直接把这些位置的数据挑出来就得到校验位,其他位置再填充信息位。

客观的讲如果有1个信息位那么它的最终编码长度至少是3 位 吧!  如果是2个信息位 最终编码就是5位长度,放3个信息位就会有6位长度,放4个信息位就得7位长度,5个信息位 

就得9位的编码长度因为第8位是2的3次方是校验位的位置。如果用数学公式表达就是:

校验码 - 海明码

  


第一个公式: r 表示  校验位数,k表示 信息位数     

第二个公式:p表示校验位数 ,D表示信息位数

比如:有4个信息位  那么编码后的总长度必须满足上面的公式,所以r 取值最小为3。   这就是信息位 数与校验位的位数的关系。 


如果在抽象点说 有x个信息位  x+r +1   <=   2的r次方。    r代表校验位。不满足这个条件就不行。


再如信息位是5位,那么 r必须取值为4  。  


校验位的位置是与编码有一定的关系之后才能进行检错纠错的。

也可以表示为:

校验码 - 海明码

n代表数据位,k代表校验位。

海明码的编码:

信息位比较简单就直接放进去就行了。复杂的是校验位填进去校验位如何计算出来需要弄清楚。通俗的讲是有一定的规律的比如:

1011     编码后的总长度是7位。  信息位 放在7   、6 、5、3 位上其他是校验位

各个位置满足一定的规律  

第 7位    7   =2的2 次方    +2的1次方    +2的0次方。 

第6位     6  = 2的2次方+2的1次方

第5位   5 = 2的2次方   +2的0次方

第三位 3 = 2的1次方 +2的0次方


可以看出 2的2次方     只有第7、6、5 用到了。所以  校验位的最高位  就等于  第7位的信息位  异或  第6的信息位  异或 第5位的信息位

r1  =   在2的1次方位置 第7位信息位用到了 2的1次方  第6 、3位用到了。  r1  =  I4   异或I3异或  I1  。r0校验位在2的0次方位置。2的0次方第7、5、3位用到了。就把这几位的值异或。ro = I4 ^ i2 ^ I1  ;


校验码 - 海明码


信息:1011   

r2  =   I4 ^   I3  ^I2         =   左到右    I4  =1     I3  =0     I2 =1    I1 =1    ;      r2 = 1^0^1   =0;


r1=I4 ^ i3 ^I1         结果等于0


ro = I4 ^ i2 ^ I1  ;   结果等于1

 

校验为是001


 

得整个编码为:1  0  1   1  1   0   1     红色为校验位值根据  黑色为信息值异或得来的。



海明校验码错了检错还可以纠错,如何做到纠错了呢?假如其他位置都对有1位出错了, 其他位置都对 就最后一个位出错了,那么我提取出来的校验位是 0 0 0,我们就会按原来产生校验位的形式再次产生校验位,并且把收到的校验位和产生的校验位做异或操作。我们重新产生一次校验位校验为是0 0 1    。那么000 与001 按位异或 得到 001。这个结果就指示出了错误的位置在1号位置 ,如果是010 就是第2位出错了,如果是110 就是第6位出错了,一旦知道那一位出错了,只要把哪一位取反就纠正了。








相关文章: