本文不阐述海明码计算方式,为了节省您的时间,请先学习海明码/奇偶校验是如何计算的,如果好奇其海明码的纠错设计思路再来看此文章!
信息为位数为n,校验位数为k,正确状态占1位,所以总位数:n+k+1。
要想用校验位校验出所有的位置应满足2^k>=n+k+1
通过奇偶校验就能判断是否出错,但是如何唯一定位到某一个的出错的位置呢?要想通过校验码体现这样的内在信息,校验码本身的位置和含义就至关重要。
海明校验码P1,P2,P3,...,Pi位置分别位于:1,2,4,8,2^k-1。
其的内在含义分别代表权值:2^0,2^1,2^2,...,2^k 在二进制中的作用相当于十进制中的"个十百千万...",基于这些权值可以组合出任意一位数x∈[0,2^k]
当某一个纠正码Si(基于检测码Pi和所维护的小组gi异或计算得出,具体请参考教材)计算出的结果与预计不符,则可以断定该校验Pi码或所负责检测的小组gi中肯定出现了异常数据。(海明码计算方法具体参考计算机组成原理教材,本文意在加深理解)
每一个校验码所负责检测的小组的所包含位置是确定的,配偶规则如下:
P1 检测的小组g1包含:1,3,5,7,9,11... 位。
P2 检测的小组g2包含:2,3,6,7,10,11,14 ... 位。
P3 检测的小组g3包含:4,5,6,7,12,13,14,15 ... 位。
为什么要这样设计呢?
教材此处给的解释理解起来较为困难。此处可以按照另一种通俗易懂方式解释:
把对应位置换成二进制
P1 检测的小组g1包含:1(00001),3(00011),5(00101),7(01001),9(10001) ... 位。
P2检测的小组g2包含:2(00010),3(00011),6(00110),7(0111),10(01010) ... 位。
P3检测的小组g3包含:4(00100),5(00101),6(00110),7(00111),12(01100) ... 位。
可一看到校验码和所负责检测的小组元素的规律为:每个元素对应的二进制在表示过程中一定用到Pi所代表的的权值(之前说过Pi在二进制中相当于权值,地位类似十进制的中的个十百千万)。比如5对应的二进制(000101)的第2位是0,,而P2代表2^1,所以P2没有能力表示5这个位置,自然也不能负责检测并纠正5这个位置。而P1代表2^0、P3代表2^2,且5(000101)的第1、3位是1,所以P1和P3可以都可以负责检测5这个位置。
7 | 6 | 5 | 4 | 3 | 2 | 1 |
D4 | D3 | D2 | P3 | D1 | P2 | P1 |
例如某次传送的正确汉明码为0100101,若传送后接受到的汉明码为0100111,其出错位可按照下述步骤确定:
二进制编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
正确汉明码 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
接收到的汉明码 | 0 | 1 | 0 | 0 | 1 | 1 | 1 |
则新的检测位为
S3=4⊕5⊕6⊕7,即S3=0⊕1⊕1⊕1 = 1
S2=2⊕3⊕6⊕7,即S2=1⊕0⊕1⊕1 = 1
S1=1⊕3⊕5⊕7,即S1=0⊕0⊕1⊕1 = 0
可以看到S3和S2出现异常,而S1未出现异常,可以分析:
一定是P3和P2共同所检测的数据出现了异常且这个数据一定不在P1所维护的数据中,
根据配偶规则,上述本质为:这个异常数据的二进制表示用肯定到了2^2、2^1,且没有用到2^0次方。其实这个数据就是S3 S2 S1本身的组合,即:110 ,也就是第6个数据位出现了异常。
此时不得不佩服海明码设计的巧妙之处,将位置和其二进制本身的特性利用的淋漓尽致。