前言
在计算机运行过程中,由于种种原因致使数据在存储过程中可能出现差错。为了能及时发现错误并及时纠正错误,通常使用一些编码方式。
奇偶校验
奇偶校验是一种添加一个奇偶位用来指示之前的数据中包含有奇数还是偶数个1的检验方式。
对于一个二进制数:bnbn−1...b2b1,添加一个校验位s,采取偶校验,即校验位使新数据中的1的个数为偶数。
新数据:bnbn−1...b2b1s。
即 bn⊕bn−1⊕...⊕b2⊕b1⊕s=0,则s=bn⊕bn−1⊕...⊕b2⊕b1。
在传输过程中,如果只有1位(奇数个位)发生了改变(包括校验位),那么将可以检测出来错误。但是如果有偶数个位发生了改变,那么校验位将是正确的,因此不能检测错误。而且,即使出现了错误,也不知道是哪一位出现了错误,数据必须整体丢弃并且重新传输。
汉明码
简介
汉明码的实质上是多重奇偶校验,通过巧妙的分组,实现了校验并纠正一位错误的能力。
编码纠错理论
任何一种编码是否具有检测能力和纠错能力,都与编码的最小距离有关。所谓编码最小距离,是指在一种编码系统中,任意两组合法代码之间的最少二进制位数的差异。
根据纠错理论得:
且且L−1=D+C 且 (D≥C)
即编码最小距离L越大,则其检测错误的位数D越大,纠正错误的位数C也越大,且纠错能力恒小于或等于检错能力。
所以,如果我们在信息编码中增加若干位检测位,增大L,显然便能提高检错和纠错能力。汉明码就是根据这一理论提出的具有一位纠错能力的编码。
关于编码最小距离
例1.1
假设我们的一种编码系统是所有的3位二进制数,即设集合,,,,,,,设集合,,,,,,,设集合S={000,001,010,011,100,101,110,111}。
那么对于任何一个数据,比如我们传输010这个数据,它发生错误会改变为:
- 第一位0变为1:110
- 第二位1变为0:000
- 第三位0变为1:011
显然,这三种数据都在集合当中,我们检验不出错误。
此时就是,L=1, 那么0=D+C。
例1.2
设集合,,设集合,,设集合S={001,010,100}。
可以看出,我们的编码最小距离为2,L=2,那么1=D+C,那么D=1,C=0。即,可以检一位错,不能纠错。
比如,我们传输数据010:
- 第一位0变为1:110
- 第二位1变为0:000
- 第三位0变为1:011
但是,110,000,011均不在集合S中,所以我们可以判断这是出错了,那怎么纠错呢?
对于出错数据110,它的可能正确数据:
- 第一位0变为1:010
- 第二位0变为1:100
- 第三位1变为0:111(不存在S中)
所以是会有两种情况,故,无法纠错。
例1.3
设集合,设集合,设集合S={000,111}。
则,且或且且或且L=3,D=1且C=1或D=2且C=0。
核心公式
设欲检测的二进制代码为n位,为使其具有纠错能力,需增添k位检测位,组成 n + k 位的代码。为了能准确对错误定位以及指出代码没错,新增添的检测位数 k应满足:
2k≥n+k+1
变换一下:
2k−1≥n+k
k位检测位可以提供2k种状态,减去一种正确的状态,即,所有错误的状态应该包括分别每一位出错的情况,这里每一位出错包括检测位,所以就是n+k。
这样是不是更好理解。
由此求出不同代码长度 n,所需检测位的位数 k:
n | K(最小) |
---|---|
1 | 2 |
2~4 | 3 |
5~11 | 4 |
12~26 | 5 |
27~57 | 6 |
58~120 | 7 |
分组
k的位数确定后,便可由它们所承担的检测任务设定它们在传送代码中的位置及它们的取值。
设n+k位代码自左至右依次编为第1,2,3,···,n+k,而将k位检测位记作Ci(i=1,2,4,8,···),分别安插在n+k位代码编号的第位上位上1,2,4,8,···,2k−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,··· 位。
- ··········
这种小组的划分有以下特点:
- 每个小组gi有一位且仅有一位为它所独占,这一位是其他小组所没有的,即gi小组独占第2i−1位(i=1,2,3,···)。
- 每两个小组gi和gj共同占有一位是其他小组没有的,即每两个小组gi和gj共同占有第2i−1+2j−1位(i,j=1,2,···)。
- 每3个小组和共同占有第和共同占有第gi,gj和gl共同占有第2i−1+2j−1+2l−1位,是其他小组所没有的。
- 依次类推。
特点似乎有点不明所以,总结起来就是:
- 小组小组g1小组: 位数为 xxx1 的二进制数表示。
- 小组小组g2小组: 位数为 xx1x 的二进制数表示。
- 小组小组g3小组: 位数为 x1xx 的二进制数表示。
- ······
稍后,我们会明白这样设计的缘由。
现在我们需要传递一个4位二进制数,记为b4b3b2b1。
那么根据前面的核心公式 2k≥n+k+1,可以求出最小的 k为3。
二进制序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
名称 | C1 | C2 | b4 | C4 | b3 | b2 | b1 |
则,根据配偶原则:
C1⊕b4⊕b3⊕b1=0
C2⊕b4⊕b2⊕b1=0
C4⊕b3⊕b2⊕b1=0
例2
令b4b3b2b1=1101,则:
C1=b4⊕b3⊕b1=1⊕1⊕1=1
C2=b4⊕b2⊕b1=1⊕0⊕1=0
C4=b3⊕b2⊕b1=1⊕0⊕1=0
故 0101的汉明码应为C1C2b4C4b3b2b1,即1010101。
纠错过程
汉明码的纠错过程实际上就是对配偶原则(或者奇)的检验,根据新数据的状态,便可直接指出错误的位置。直接看例子:
例3
已知,传送的正确汉明码是1010101(配偶原则),传送后接受到的汉明码为1010111:
二进制序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
发送的汉明码 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
接收的汉明码 | 1 | 0 | 1 | 0 | 1 | 1 | 1 |
检测:
- P4=4⊕5⊕6⊕7=0⊕1⊕1⊕1=1
- P2=2⊕3⊕6⊕7=0⊕1⊕1⊕1=1
- P1=1⊕3⊕5⊕7=1⊕1⊕1⊕1=0
可见,和和P4和P2都不为 0,显然出错了。
那如何找出错误呢?
这里是假设只出现一位错误,因为此时的L=3,只能检一位错,纠一位错。
- 因为P1=0,所以可以认为 ,,,,,,1,3,5,7都没有错。
- ,,P4=1,P2=1,说明 ,,,,,,4,5,6,7中有一位错, ,,,,,,2,3,6,7中有一位错。
- 那现在错误的范围就缩小到了,,,4,6中有一位是错的,,,2,6中有一位错的。
- 显然,第6位是错的。
此时,更加巧合的是:二进制数P4P2P1=110恰好是6。
换句话说,检测出的信息所表示的数就是出错的位置。
韦恩图
我们用韦恩图来表示一下刚刚找错误位的过程:
刚刚找 6的过程不就是:¬P1∩P2∩P4,这样十分巧妙地利用集合就找出了错误的位。
这样可以理解之前设计的原因了吧。
参考文献
唐朔飞. 计算机组成原理[M]. 第3版. 高等教育出版社, 2020.