在计算机运行过程中,由于种种原因导致数据在存储过程中可能出现差错,为了能够及时发现错误并且将错误纠正,通常可以将原数据配成汉明编码。
汉明码具有一位纠错能力。
设将要进行检测的二进制代码为n位,为使其具有纠错能力,需要再加上k位的检测位,组成n+k位的代码。那么,新增加的检测位数k应满足:
2k≥n+k+1或2k-1≥n+k
代码长度和检测位数的关系
N |
K(最小) |
1 |
2 |
2~4 |
3 |
5~11 |
4 |
12~26 |
5 |
27~57 |
6 |
58~120 |
7 |
假设将要进行检测的二进制代码为0101,位数n=4,根据公式2k≥n+k+1可以得出k的值是3,所以最终形成的汉明码应为n+k=7位。
所以分组分为P1、P2、P4。原因则是第一组是20、第二组则是21 、同理第三组则是22 、依次列推分组应按照2k-1。同时以后根据分组产生的数插入的位置也是按照此规律插入,比如第一组插入20、即第1位,第二组插入21 、即第2位,以此类推。那么组分好了,他们每一组中包含的位则是:
p1包含(1,3,5,7,9,11,...位)
p2包含(2,3,6,7,10,11,14,15,...位)
p3包含(4,5,6,7,12,13,14,15,...位)
每一组中包含的数又是如何确定的呢?我们来看下面这个表格
编号 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
… |
二进制 |
0001 |
0010 |
0011 |
0100 |
0101 |
0110 |
0111 |
1000 |
1001 |
1010 |
1011 |
… |
序号 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
名称 |
C1 |
C2 |
B4 |
C4 |
B3 |
B2 |
B1 |
传送数 |
|
|
0 |
|
1 |
0 |
1 |
其中C1、C2、C4是我们插入的检测位
如果按照配偶原则来配置汉明码,则C1应使1 3 5 7位中“1”的个数为偶数;C2应使2 3 6 7位中“1”的个数为偶数;C4应使4 5 6 7位中“1”的个数为偶数。
按照上面我所说的则:
C1=③位+⑤位+⑦位,即C1=B4+B3+B1=0+1+1=0
C2=③位+⑥位+⑦位,即C2=B4+B2+B1=0+0+1=1
C4=⑤位+⑥位+⑦位,即C4=B3+B2+B1=1+0+1=0
所以0101的汉明码应为C1C2B4C4B3B2B1,即0100101
汉明码还存在配奇原则,下面来讲一讲配奇原则。按照配奇原则配置1100101的汉明码。
根据1100101可知n=7。根据公式我们可以求出需要添加k=4位检测位,详细情况如下表。
二进制序号 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
汉明码 |
C1 |
C2 |
1 |
C4 |
1 |
0 |
0 |
C8 |
1 |
0 |
1 |
按配奇原则配置,则
C1=③位+⑤位+⑦位+⑨位+11位+1=1+1+0+1+1+1=1
C2=③位+⑥位+⑦位+10位+11位+1=1
C4=⑤位+⑥位+⑦位+1=0
C8=⑨位+10位+11位+1=1
所以按配奇原则新配置的汉明码为11101001101
汉明码的纠错
根据以上说的汉明码的配偶原则和配奇原则我们来看汉明码的纠错。设接收到的错误汉明码(按配偶原则配置)是0100111,我们可以根据上述规律来确定出错位。
二进制序号 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
接收到的汉明码 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
P1=①位+③位+⑤位+⑦位,即P1=0+0+1+1=0
P2=②位+③位+⑥位+⑦位,即P2=1+0+1+1=1
P4=④位+⑤位+⑥位+⑦位,即P4=0+1+1+1=1
根据P4P2P1构成的二进制是110,将110转换成十进制为6,说明是第6位出错,或者根据配偶原则的规律,其“1”的个数必须是偶数也能判断出是第6位,所以第六位应将“1”改为“0”,那么正确的汉明码应为0100101。
那么为什么在汉明码纠错过程中,新的检测位P4P2P1的状态即指出了编码中错误的信息位?
汉明码属于分组奇偶校验,P4P2P1=000,说明接收方生成的校验位和收到的校验位相同,否则不同说明出错。由于分组时校验位只参加一组奇偶校验,有效信息参加至少两组奇偶校验,若果校验位出错,P4P2P1的某一位将为1,刚好对应位号4、2、1;若果有效信息出错,将引起P4P2P1中至少两位为1,如B1出错,将使P4P1均为1,P2=0,P4P2P1=101,