和海明码,如图7 则表示了信息码为1001 时的海明码编码的全部情况。而图8 中则列出了全部16 种信息(D1D2D3D4=0000~1111)的海明码。 码字位置 B1 B2 B3 B4 B5 B6 B7 码位类型 P1 P2 D1 P3 D2 D3 D4 信息码 四位信息码的海明编码P1 P2 D1 P3 D2 D3 D4 未编码信息的海明码上面是发送方的处理 在接收方,也可根据这三个校验方程对接收到的信息进行同样的奇偶测试: A=B1B3B5B7=0; B=B2B3B6B7=0; C=B4B5B5B7=0。 若三个校验方程都成立,即方程式右边都等于0,则说明没有错。若不成立即方程式右边不等于0,说明有错。从三个方程 式右边的值,可以判断那一位出错。例如,如果第3 位数字反了,则C=0(此方程没有B3),A=B=1(这两个方程有B3)。可 构成二进数CBA,以A 为最低有效位,则错误位置就可简单地用二进数CBA=011 指出。 同样,若三个方程式右边的值为001,说明第1 位出错。若三个方程式右边的值为100,说明第4 位出错。 海明码的码距应该是3,所以能纠正1 位出错。而奇偶校验码的码距才是2,只能发现1 位出错,但不能纠正(不知道那 一位错)。无校验的码距是1,它出任何一位出错后还是合法代码,所以也就无法发现出错。 这是关于海明码的经典说法,即码距为3,可以发现2 位,或者纠正1 位错。应满足2k-1m+k。 但在清华的王爱英主编的《计算机组成与结构》(该书已成为国内的权威)中还提出了一种码距为4的海明码,可以发现2 位,并且纠正1 位错。应满足2(k-1)m+k。 海明码是在信息字段中插若干位数据,用于监督码字里的哪一位数据发生了变化。假设信息位有k 位,需要多少位监督数据才能 监督并改正一位错误?假设需要r 位监督数据的话,整个码字的长度就是k+r;每一位的数据只两种状态,不是1 就是0,有r 位数据就应该能表示出2 种状态,如果每一种状态代表一个码元发生了错误,有k+r位码元,就要有k+r 种状态来表示,另外还 要有一种状态来表示数据正确的情况,所以2 要大于等于k+r+1才能监督一位错误,即2 >=k+r+1得,r>=3,也就是至少需要3 位监督数据才能发现并改正1 位错误。 海明校验码: 构造出海明码的方式有很多,因为监督关系是自定义的。以(7,4)海明码为例(说明:4 个数据位, 个监督位,因为要满足式子2 >=k+r+1,所以r>=3),来推导下它的构造过程。因为有三个监督位(具体位置不确定),必然有三个监督式,假设三个监督式分别是S1、S2、S3,用S3S2S1 来指示一 位数据出错了,例如,我可以指定,若S3S2S1=1 就表示第1 位数据出错了,S3S2S1=3,就表示第3 位数据出错了,…… 假设最终生成的海明码是A7A6A5A4A3A2A1,我自己规定,若S3S2S1=0,表示数据传输没有出错,S3S2S1=1,表示A1 出错; S3S2S1=2,表示A2 出错;S3S2S1=3,表示A3 出错;S3S2S1=4,表示A4 出错;S3S2S1=5,表示A5 出错;S3S2S1=6,表示A6 出错;S3S2S1=7, 表示A7 出错。那么就是这样一张纠错表: S3S2S1 000001 010 011 100 101 110 111 出错的位置 无错 A1 A2 A3 A4 A5 A6 A7 从上表可以看出,当S1=1 时,表示A1、A3、A5、A7 中有一个出错了,即S1 是用来监督A1、A3、A5、A7 这些位置的,所 以就得到了监督关系式S1= A1A3A5A7。通过上表,同理得到S2= A2A3A6A7;S3= A4A5A6A7。 用上面三个监督关系式,就可以知道,A1、A2、A4 这三个是监督位,剩下的四位A7 A6 A5 A3 就是数据。(S1S2S3= A1A2A4,所以这三位是监督位)。 那这三个位上的值应该取多少呢?数据在还没有进行传输时,数据是不会有错的,即S3S2S1=0,代入以上三个监督关 S1=A1A3A5A7=0 S2= A2A3A6A7=0 S3= A4A5A6A7=0 即算得 A1= A3A5A7 A2= A3A6A7 A4= A5A6A7 有了以上这些准备工作,接下来就实际算一个海明码出来