计算机编码问题总结——海明码(通俗易懂)


我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下计算机中的编码问题,来看第二部分,海明码。

很多初学者一看到海明码就郁闷,因为课本上关于海明码的描述实在是太难懂了。那就跟随我一起来搞懂海明码,我用最简单最好懂的方式描述,我不会使用高深的数学术语,你一定能看懂。

先耐心看完下面这几段,这是理解的基础。假设1帧包含m个数据位(报文数据位)和r个冗余位(校验位),则帧的长度n=m+r。这n位单元通常称为n位码字。

海明码距(码距)是两个码字中不相同的二进制位的个数,两个码字的码距是一个编码系统中任意两个合法编码(码字)之间不同的二进制数的位数,编码系统的雄踞是整个编码系统中任意两个码字的码距的最小值。误码率是传输错误的比特占所传输比特总数的比率。好了,看了这里估计有人已经要放弃了,我们换个通俗易懂的理解。

假如你设计一个编码系统,用两个比特位表示4个不同的信息,如下:信息0用00表示,信息1用01表示,信息2用10表示,信息3用11表示。任意两个码字之间不同的比特位数为1或者2,最小值为1,,故该编码系统的码距为1。即使码字中的任何一位或者多位出错了,结果中的码字也仍然是合法码字。比如,如果传送信息10,出错了变成11了,但由于11还是属于合法码字,所以接收方仍然认为11是正确的信息。这样就无法知道传输是否出问题了。

但是,如果用3个二进位来编4个码字,那么码字间的最小距离可以增加到2,如下:信息0用000表示,信息1用011表示,信息2用101表示,信息3用110表示。这里任意两个码字相互间最小有两个比特位的差异。因此,如果任何信息中的一个比特位出错,那么将成为一个不用的码字,接收方能检查出来。例如信息是110,因出错成为了100,但100不是合法码字,这样接收方就能发现出错了。

我这样说大家是不是就好理解了?好,现在我们总结一下,检测d个错误,则编码系统码距>=d+1;纠正d个错误,则编码系统码距>2d。

海明码是一种多重奇偶检错码,具有检错和纠错的功能。海明码的全部码字由原来的信息和附加的奇偶校验位组成。奇偶校验位和信息位赋值在传输码字的特定位置上。这种组合编码方式能找出发生错误的位置,无论是原有信息位,还是附加校验位。

我们设海明码校验位为k,信息位为m,则它们之间的关系应用满足m+k+1<=(2的k次方)。

下面我们就正式开始了,我们以发送端发送原始信息101101为例,讲解海明码推导与校验过程。

1。确定海明码校验位长。m是信息位长,101101的m=6。根据m+k+1<=(2的k次方),解不等式得到最小k为4,即校验位为4,信息位加校验的总长度为10位。

2。推导海明码开始。那我们究竟要发送什么样的编码才可以呢,海明码校验位通常被从左至右安排在1(2的0次方)、2(2的1次方)、4(2的2次方)、8(2的3次方)、......的位置上。原始信息则从左至右填入剩下的位置。P1、P2等为检验位编号,B1、B2等为位置编号,如下,看下图时注意上下对齐:

P1   P2    1    P3     0     1     1     P4     0     1

B1   B2   B3   B4    B5   B6   B7   B8   B9   B10

校验位处于B1、B2、B4、B8位,剩下位为信息位,信息位依从左至右的顺序先行填写完毕。

3。计算校验位。把除去1、2、4、8(校验位位置值编号)之外的3、5、6、7、9、10值转换为二进制位,如下:

信息位B3     信息位编号的十进制为3     信息位编号的二进制为0011

信息位B5     信息位编号的十进制为5     信息位编号的二进制为0101

信息位B6     信息位编号的十进制为6     信息位编号的二进制为0110

信息位B7     信息位编号的十进制为7     信息位编号的二进制为0111

信息位B9     信息位编号的十进制为9     信息位编号的二进制为1001

信息位B10   信息位编号的十进制为10   信息位编号的二进制为1010

先把满足条件二进制位最低位(右边第1位)为1的所有Bi进行异或(xor)操作,结果填入P1。然后是右边第2位为1所有进行操作填入P2,依此类推。

依据上述方法得到校验位:

P1=B3 xor B5 xor B7 xor B9=1 xor 0 xor 1 xor 0=0

P2=B3 xor B6 xor B7 xor B10=1 xor 1 xor 1 xor 1=0

P3=B5 xor B6 xor B7=0 xor 1 xor 1 =0

P4=B9 xor B10=0 xor 1 =1

全部填入后得到如下:

 0     0     1      0      0      1     1      1     0      1

B1   B2   B3   B4    B5   B6   B7   B8   B9   B10

好了,到这里为止,信息的校验位加好了,发送端就准备要把这个加了校验位的信息发送出去了。当程序执行到发送命令后,这条信息就发送出去了,飞往目的端了。

4。校验。现在目的端收到这条信息了,想看看信息有没有错误,那就要执行校验程序,看看有没有问题,那怎么做呢,我们继续往下看。

将所有信息位位置编号1-10的值转换为二进制位

信息位B1     信息位编号的十进制为1     信息位编号的二进制为0001

信息位B2     信息位编号的十进制为2     信息位编号的二进制为0010

信息位B3     信息位编号的十进制为3     信息位编号的二进制为0011

信息位B4     信息位编号的十进制为4     信息位编号的二进制为0100

信息位B5     信息位编号的十进制为5     信息位编号的二进制为0101

信息位B6     信息位编号的十进制为6     信息位编号的二进制为0110

信息位B7     信息位编号的十进制为7     信息位编号的二进制为0111

信息位B8     信息位编号的十进制为8     信息位编号的二进制为1000

信息位B9     信息位编号的十进制为9     信息位编号的二进制为1001

信息位B10   信息位编号的十进制为10   信息位编号的二进制为1010

然后进行如下操作:

将所有信息编号的二进制的右边第1位为1的Bi进行异或操作,得到X1。将所有信息编号的二进制的右边第2位为1的Bi进行异或操作,得到X2。将所有信息编号的二进制的右边第3位为1的Bi进行异或操作,得到X4。将所有信息编号的二进制的右边第4位为1的Bi进行异或操作,得到X8。

上述过程对应公式描述如下:

X1=B1 xor B3 xor B5 xor B7 xor B9

X2=B2 xor B3 xor B6 xor B7 xor B10

X4=B4 xor B5 xor B6 xor B7

X8=B8 xor B9 xor B10

计算后得到一个形式为X8X4X2X1的二进制,转换为十进制时,结果为0,则未发生比特差错;结果为非0(假设为a),则错误发生在第a位。

好,现在我们把全过程模拟一遍,

假设起始端发送加了上述校验码的信息(原始信息为101101,加上校验码后为0010011101),目的端收到的信息为0010111101(看到没有,目的端收到了错误的信息,从左到右第5位发生的变化,这一位与原信息不同了),如下:

 0     0     1      0       1     1     1      1     0      1

B1   B2   B3   B4    B5   B6   B7   B8   B9   B10

依据公式为:

X1=B1 xor B3 xor B5 xor B7 xor B9=0 xor 1 xor 1 xor 1 xor 0=1 

X2=B2 xor B3 xor B6 xor B7 xor B10=0 xor 1 xor 1 xor 1 xor 1=0

X4=B4 xor B5 xor B6 xor B7=0 xor 1 xor 1  xor 1=1

X8=B8 xor B9 xor B10=1 xor 0 xor 1=0

则将X8X4X2X1=0101的二进制转换为5。结果非0,则错误发生在第5位。

到这里就全部结束了,大家应该听懂了吧,写这么长不容易,请大家给个好评吧。


作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

你可能感兴趣的:(windows,microsoft,学习方法)