奇偶校验码和海明码

当计算机在传送比特数据时,如果有一个比特位出错了该怎么发现?
这里有一个前提,计算机在传输一段适当长度的比特数据时,有一个比特位出错的概率很低,同时有两个比特位出错的概率极低,所以实践中我们只需考虑一个比特位出错时的情况。
解决的办法之一是每一个比特位都接连传送两次,比如要想传送1,实际就传送11,这样如果前后两个比特位值一样,就可认为比特位没出错。这种方法类似于在用户注册时,输入一遍密码后,还要再输入一遍确认密码,两遍密码输入一样即认为用户没有输错。
但是这个方法会带来一个问题,就是使传输数据量翻倍。
一个解决办法就是使用奇偶校验码,通过增加一个校验比特位的方式,将一段二进制数据中的1凑成偶数(偶校验),或是凑成奇数(奇校验),前面举的只传输一个比特位的例子实际上即为偶校验的一个特例。
但是这个方法又会带来一个问题,虽然附加的校验位少了,但是一旦错了就要重传一整段数据,开销还是比较大。
解决的思路是能否在发现错的同时,还知道错哪了?这样在本地即可进行修正,不需要再重新传。
一是考虑有两个二进制编码,如果一个编码只需要变动一个比特位即可变为另一个编码,那么在传送这两个编码时,即使传错了也没法发现,接收方会以为要传的就是传错的那个。如果一个编码需要变动两个比特位才能变成另一个编码,那么在传送一个编码时,如果传错了是可以发现的,因为错了一个比特位,就哪个编码都不是了,但这时只是知道传错了,并不知道想传的是哪个,因为任何一个编码错一个比特位都可以是现在收到的这个错误码。接下来继续把距离拉大,如果一个编码需要变动三个比特位才能变成另一个编码,这时如果在传送时错了一个比特位,就不仅可以知道传错了,还可以知道是传哪个码时出的错,只为只有一个码在错一个比特位时才能变成现在这个错误的码。
上面提到的这个距离,就叫做码距。所以要想实现即知道错了,又知道哪错了,码距至少为3.
一个叫海明的人研究了几年,根据这个思路,发明了海明码。
海明码利用奇偶校验码来发现错误,利用校验码的排列组合,来标记出错的位置。
举一个简单的例子,如果一个二进制码有7位,则共有7种出错的可能和1种不错的可能,共8种可能。这8种可能通过3个校验码的排列组合即可实现。所以7位海明码中有3个校验位,4个数据位。

你可能感兴趣的:(奇偶校验码和海明码)