在计算机运行过程中,由于种种原因致使数据在存储过程中可能出现差错。为了能及时发现错误并及时纠正错误,通常可将原数据配成汉明编码。

汉明码的组成

汉明码是由Richard Hanming1950年提出的,它具有一位纠错能力。

由编码纠错理论得知,任何一种编码是否具有检测能力和纠错能力,都与编码的最小距离有关。所谓编码最小距离,是指在一种编码系统中,任意两组合法代码之间的最少二进制位数的差异。

根据纠错理论得.

L-l = D + C 且 DC

即编码最小距离L越大,则其检测错误的位数D越大,纠正错误的位数C也越大,且纠错能力恒小于或等于检错能力。例如,当编码最小距离L =3时,这种编码可视为最多能检错二位,或能检错一位、纠错一位。可见,倘若能在信息编码中增加若干位检测位,增大L显然便能提高检错和纠错能力。汉明码就是根据这一理论提出的具有一位纠错能力的编码。

设欲检测的二进制代码为n位,为使其具有纠错能力,需增添k位检测位,组成 n + k位的 代码。为了能准确对错误定位以及指出代码没错,新增添的检测位数k为应满足:

2  n + k + 1

由此关系可求得不同代码长度n所需检测位的位数k如表4. 2所示。

4.2代码长度与检测位位数的关系


n

最小)

1

2

2 ~ 4

3

~ 11

4

12 ~26

5

27 ~ 57

6

58  ~ 120

7


为的位数确定后,便可由它们所承担的检测任务设定它们在被传送代码中的位置及它们的取值。

n+k位代码自左至右依次编为第1,2,3,……,n+k位,而将为位检测位记作Ci(i = 1,2,4, 8 ,…),分别安插在n k位代码编号的第1,2,4,8, ……,2k-1位上。这些检测位的位置设置是为了保证它们能分别承担n+k位信息中不同数位所组成的“小组”的奇偶检测任务,使检测位和它所负责检测的小组中1的个数为奇数或为偶数,具体分配如下:

C1 检测的 g1小组包含 1,3,5,7,9,11,……位。

C2 检测的 g2小组包含 2,3,6,7,10,11,14,15, ……位。

C4 检测的 g3小组包含 4,5,6,7,12,13,14,15, ……位。

C8检测的g4小组包含  8,9,10,11,12,13,14,15,24,…位。

其余检测位的小组所包含的位也可类推。这种小组的划分有如下特点:

  • 每个小组gi,有一位且仅有一位为它所独占,这一位是其他小组所没有的,即gi小组独占 第 2i-1i = l,2,3,…)。
  • 每两个小组gi gj共同占有一位是其他小组没有的,即每两小组gi gj共同占有第 2 i-1 +2 j-1位 (ij=l,2,...)
  • 3个小组gi gjgl 共同占有第2 i-1 +2 j-1+2 l-1位,是其他小组所没有的。

依次类推,便可确定每组所包含的各位。

例如,欲传递信息为b4b3b2b1(n = 4,根据2k≥ n+ k + l,可求出配置成汉明码需增添检测位k=3,且它们位置的安排如下:

二进制序号

1

2

3

4

5

6

7

名称

C1

C2

b4

C4

b3

b2

b1

如果按配偶原则来配置汉明码,则C1应使1357位中的“1”的个数为偶数;C2应使23、 67位中的“1”的个数为偶数; C4应使4567位中的“1”的个数为偶数。

故C1应为3位㊉5位㊉7位,即C1=b4 ㊉b3 ㊉b1;C2应为3位㊉6位㊉7位,即C2 = b4 ㊉ b2 ㊉ b1 ;C4 应为 5 位㊉6 位㊉7 位,即C4 = b3㊉b2 ㊉b1  。

令 b4b3b2b1 =0101,则

C1 = b4㊉b3 ㊉b1 = 0㊉l ㊉1 =0

C2 = b4㊉b2㊉bl = 0㊉0㊉l =1

C4 = b3㊉b2㊉bl = 1㊉0㊉1 =0

故 0101 的汉明码应为 C1C2b4C4b3b2bl  即 0100101。

2、汉明码的纠错过程

汉明码的纠错过程实际上是对传送后的汉明码形成新的检测位Pi = (i= l,2,4,8,……,根据Pi的状态,便可直接指出错误的位置。Pi的状态是由原检测位Ci及其所在小组内“1”的个数确定的。倘若按配偶原则配置的汉明码,其传送后形成新的检测位Pi应为0,否则说明传送有错,并且还可直接指出出错的位置。由于PiCi有对应关系,故P,可由下式确定:

P1 = 1 ㊉ 3 ㊉ 5 ㊉ 7,即P1 =C1 ㊉ b4 ㊉ b3 ㊉ b1

P2 = 2 ㊉ 3 ㊉ 6 ㊉7,即P2 = C2 ㊉ b4 ㊉ b2 ㊉ b1

P4=4 ㊉ 5 ㊉ 6 ㊉7,即P4 = C4 ㊉ b3 ㊉ b2 ㊉ b1

设已知传送的正确汉明码(按配偶原则配置)为0100101,若传送后接收到的汉明码为0100111,其出错位可按下述步骤确定。

二进制序号

1

2

3

4

5

6

7

正确的汉明码

0

1

0

0

1

0

1

接收到的汉明码

0

1

0

0

1

1

1

则新的检测位为

P4 = 4 ㊉ 5 ㊉ 6 ㊉ 7,即P4 =0 ㊉ 1 ㊉ 1 ㊉

P2 = 2 ㊉ 3 ㊉ 6 ㊉ 7,即P2 =1 ㊉ 0 ㊉ 1 ㊉

P1 = 1 ㊉ 3 ㊉ 5 ㊉ 7,即P1 =0 ㊉ 0 ㊉ 1 ㊉

由此可见,传送结果P4和P2均不呈偶数,显然出了差错。那么,错在哪一位呢?仔细分析发现,只有第6位出错才会同时使P4和P2不呈偶数。同时P4 P2 P1所构成的二进制值恰恰是出错的位置,即P4P2P1 =110,表示第6位出错。发现错误后,计算机便自动将错误的第6“1” 纠正为“0”

又如,若收到按偶配置的汉明码为H00101,则经检测得

P4 = 4 ㊉ 5 ㊉ 6 ㊉ 7,即P4 =0 ㊉ 1 ㊉ 0 ㊉

P2 = 2 ㊉ 3 ㊉ 6 ㊉ 7,即P2 =1 ㊉ 0 ㊉ 0 ㊉

P1 = 1 ㊉ 3 ㊉ 5 ㊉ 7,即P1 =1 ㊉ 0 ㊉ 1 ㊉

P4P2P1 = 001,表示第1位出错。由于第1位不是欲传送的信息位,而是检测位,而检测位不参与运算,故在一般情况下可以不予纠正。

以上均以n=4为例,其实对任意不同n位的信息,均可按上述步骤配置汉明码,即先求出需增加的检测位位数k再确定Ci的位置,然后,按奇或偶原则配置Ci各位的值即可。值得注意的是:按奇配置与按偶配置所求得的Ci值正好相反,而新的检测位Pi的取值与奇偶配置原则是相对应的,读者可自行分析。

汉明码常常被用在纠错一位的场合,若欲实现检错两位,实用时还得再增添一位检测位。