汉明码原理

最近做了个misc的题目,讲的是汉明码,后来百度一搜还说是计算机网络的知识,我当时就懵了,我可以很确定我们计网并没有讲(我每一节课都有认真听),结果今天上计算机组成原理的时候不小心翻到了,这个汉明码估计是在有些在计网的书有!!这个玩意儿理解了其实也并不是很难。一起来看看吧!

什么是汉明码

汉明码又称海明码,是由Richard Hamming提出的一种校验方法。它实际上是一种多重奇偶校验,即将代码按照一定规律组织为若干小组,分组进行奇偶校验,各组的检错信息组成一个指误字,不但能检测是否出错,而且在只有一位出错的情况下指出是哪一位错。

冗余位个数的判断

冗余位大概意思就是校验码,当传入一串二进制有效信息时需要在其中插入冗余码进行校验,以确保信息在传输过程中不会发生丢失或者改变。

冗余位的个数的计算满足香农第二定理如下:

k + r <= 2^r - 1

k为传入有效信息二进制的位数,r为冗余位个数。比如:传入一串二进制的数据为:1001011。总共七位即 k = 7,所以可以计算出 r >= 4,即r 为 4 ,可以组成11为海明码

奇偶校验

主储存器一般都支持奇偶校验,这是一种简单且应用广泛的校验方法,一般是通过对数据的奇数或者偶数判断决定冗余位为0还是1。

奇校验

假设只有一位冗余码,对于需要发送的数据信息比特,检查其中 “1” 的个数,为了确保有效信息加上冗余位后 “1” 的个数为奇数,所以如果传入有效信息中 “1” 的个数为奇数,则冗余位为 “0” 。如果传入的有效信息中 “1” 的个数为偶数,则冗余位为 “1” 。

情形一:

情形二:

偶校验

与奇校验恰好相反,偶校验是在对有效信息进行判断 “1” 的个数,保证加了冗余位以后“1”的数量为偶数。若有效信息为奇数,则冗余位为 “1” ;若有效信息为偶数,则冗余位为 “0” 。

情形一:

情形二:

奇偶校验还能判别出单个数据是否出现了错误,比如传输过程中某一位的1变0或者某一位的0变1就会导致它的奇偶性变化了,但是仅限于奇数个数据的变化,如果是偶数个就无法鉴别出来。

冗余位的位置 和  检验号分组方法

前面提到过冗余位的个数是根据香农第二定理来判定的,那冗余位的位置又该放在哪儿呢?还有就是校验号分组是什么东西?下面细说:

冗余位的位置依照公式:2^(k - 1)( k >= 0),k表示第几个冗余位。

第一个冗余位:2^(1-1) = 1

第二个冗余位:2^(2-1) = 2

第三个冗余位:2^(3-1) = 4

………………………………

假设有一串有效数据:101100,根据计算得到冗余位个数为4个则有下图:

 前面讲到奇偶校验,但是是对一位冗余位而言,那如果出现这种多位冗余位又该怎么利用到这个奇偶验证呢?这里要提一个很妙的分组,它能保证到每一个分组刚刚好只有一个冗余位,进而可以实现奇偶检验。

直接分析:我们可以看到冗余位为:1、2、4、8、16……………………

当他们换算为二进制后就会是:00001、00010、00100、01000、10000、………………

发现规律了吗?分组就是按照二进制(从右到左数)1的位置。比如:

二进制为 “ ****1 ”是属于第一组的

二进制为 “ ***1* ”是属于第二组的

二进制为 “ **1** ”是属于第三组的

……………………………………………………………………

汉明码编码

既然讲了冗余位的位置奇偶校验校验号分组那就可以直接进行编码了。举几个实例,

有一串有效数据:110100,求它汉明编码过后的数据。

根据分析校验号分组的

第一组为:1、3、5、7、9(二进制从右往左第一位为“1”的)。

第二组为:2、3、6、7、10(二进制从右往左第二位为“1”的)。

第三组为:4、5、6、7(二进制从右往左第三位为“1”的)。

第四组为:8、9、10(二进制从右往左第四位为“1”的)。 

冗余位的计算我们拿奇校验做例子,偶校验可以自己试试。

第一组1、3、5、7、9

第一组有2个“1”,为偶数,我们用的是奇校验,所以冗余位为 “1” 。

第二组2、3、6、7、10

第二组有3个 “1” ,为奇数,所以奇校验成功,冗余位为 “0” 。

第三组4、5、6、7

第三组有2个“1”,为偶数,因为是奇校验,所以冗余位为 “1” 。

第四组8、9、10

第四组没有“1”,所以冗余位为“1”保证其为奇数。 

最后我们得到汉明编码奇校验答案为:1011011100

汉明码查错与纠错

如果被编码好的汉明码突然出现了一个数据变化,那么能检测出来吗?能检测出是哪个位置变换了吗?如上面的 1011011100 突变成了 1011001100怎么判断哪里出错了?

这里我们可以通过对校验号分组中一组一组的检测,如果碰到了出问题的也就是偶数个“1”我们就得补一个“1”。直接处理:

第一组:(1、3、5、7、9)3个“1”,为奇数,所以第一组没问题因此补个 “0” 。

第二组:(2、3、6、7、10)2个“1”,为偶数,所以这几个中有个数据出问题了,需要补一个 “1”。

第三组:(4、5、6、7)2个“1”,为偶数,所以这几个中有个数据出问题了,需要补一个“1”。

第四组:(8、9、10)1个“1”,为奇数,第四组没问题因此补个“0”。

可以看到他们连在一起组成了一串二进制,(从上往下读)为0110即6,所以就是说6号位出问题了。 

参考:汉明码(Hamming Code)原理及实现 - PhiliAI - 博客园

汉明码——计算机网络——全网最通俗的讲解_刘扬俊的博客-CSDN博客_汉明码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

errorr0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值