海明校验码经常考试当中会考到海明码是个难点。首先需要了解海明码编码的规则,如何编码和计算多少位信息位需要多少个校验位。
一个经过海明码编码完成之后那些是位置是校验位那些是信息位。在这种编码体系当中明确规定了校验位的位置,是位于整个信息编码完成的的这个信息编码的当中的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 。
校验位的位置是与编码有一定的关系之后才能进行检错纠错的。
也可以表示为:
海明码的编码:
信息位比较简单就直接放进去就行了。复杂的是校验位填进去校验位如何计算出来需要弄清楚。通俗的讲是有一定的规律的比如:
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位出错了,一旦知道那一位出错了,只要把哪一位取反就纠正了。