海明码的一个关键特点是能够检测和纠正单个位错误,并且能够检测多个位错误
校验位r公式为 (m是数据位):
标准海明码的最小距离固定为 3
最大纠错 n = (d-1) / 2
假设 1100
校验位 :r = 3 因为公式:
数据位 4 (1100一共4位)
一共 4 + 3 =7 位
假设数据位 = D4D3D2D1
假设校验位 = H3H2H1
校验码的位置都处在2的n(n=1,2,3...)次方中,即位于1,2,4,8,16....的位置上,其余为才能填充数据。
如:
填入校验位
位数(一共7位) |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
数据 |
H3 |
H2 |
H1 | ||||
值 |
填入数据位
位数(一共7位) |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
数据 |
D4 |
D3 |
D2 |
H3 |
D1 |
H2 |
H1 |
值 |
1 |
1 |
0 |
0 |
分组
我们需要确认H1,H2,H4这三个校验位都来校验哪些位置。
我们按这个规则进行分配。
将1,2,4(校验位的位数)
的二进制码写出来,并且最高位补到3位(前面算的K数)
如下所示:
1 |
2 |
4 |
001 |
010 |
100 |
然后我们将0替换为*,作为通配表。
1 |
2 |
4 |
**1 |
*1* |
1** |
我们将1到7的二进制序列,列出来如下表
位数 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
对应二进制 |
111 |
110 |
101 |
100 |
011 |
010 |
001 |
!!!重点!!!!
我们将7->1依次与上面的通配表进行匹配
1 |
2 |
4 |
**1 |
*1* |
1** |
001(1) |
010(2) |
100(4) |
011(3) |
011(3) |
101(5) |
101(5) |
110(6) |
110(6) |
111(7) |
111(7) |
111(7) |
因此我们可以确定
H1 负责 1 3 5 7 位数的校验
H2 负责 2 3 6 7 位数的校验
H4 负责 4 5 6 7 位数的校验
计算校验位是0还是1
位数(一共7位) |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
数据 |
D4 |
D3 |
D2 |
H3 |
D1 |
H2 |
H1 |
值 |
1 |
1 |
0 |
0 |
海明码默认进行偶校验(除非特别说明是奇校验)
已知 H1负责 1 3 5 7 的位数,其中1的位数是H1是未知的,3是D1=0,5是D2=0,7是D4=1,一共有1个1(D4=1),因为默认使用偶校验,必须有偶数个1(奇校验就有奇数个1), 所以 H1 = 1(就有两个1,D4=1,H1=1)
同理 H2负责 2 3 6 7 的位数,其中1的个数为偶数 所以 H2 = 0
同理H3负责4 5 6 7的位数,其中1的个数为偶数 所以 H3 = 0
效验位 = H3H2H1 = 001
位数(一共7位) |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
数据 |
D4 |
D3 |
D2 |
H3 |
D1 |
H2 |
H1 |
值 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
数据 = 1100 001