目录
汉明码
❀❀理解汉明码的前戏:奇偶校验码
❀❀汉明码检错思想
❀❀汉明码的分组方式
❀❀汉明码的纠错检错
✨✨1位纠错
✨✨2位检错
❀❀尾言
汉明码又称为海明码,它是基于奇偶校验码,由理查德·卫斯里·汉明设计发明出来的一个在计算机编解码期间检错并纠错的一种方法,(只能说他好牛啊!!!/(ㄒoㄒ)/~~)。是计算机组成原理和计算机网络的重要考点,书本讲述的比较官方晦涩,下面我用较为通俗的语言交流下汉明码的检错纠错和设计思想。汉明码只能用于1位错误的纠错,和两位错误的检错(多了就不行了),俗称纠1检2。
这个长话短说,因为奇偶校验码十分的简单,当然汉明码也不难(只是记的话哈)!
两个设备之间传送数据难免会有错误,奇偶校验码只能用于一(奇数)个比特位的检错,发现错误就会被重发。
原理就是:在数据码的首位或者末尾加上一个校验码,分别采用奇校验或者偶校验。加入传输的数据是010110,校验码加首位的话
奇校验:为了使整个码的1的个数是奇数位,故首位加0:0010110,计算机传输过去出现一位错误的话,那么就是说1的个数变成偶数个,通过按位异或就会发现结果是0,错误重发。
偶校验:为了使整个码的1的个数是偶数位,故首位加1:1010110,奇数个错误的话计算机按位异或每个数就会发现1的个数变成奇数个。异或之后结果为1,cpu发送指令重新发送。
汉明码是基于偶校验实现的一种纠1检2的的方法,一言不合就上图
假如有七个数,咱们分三组,那如何知道是那个数发现错误呢?(现在先不关心咋分的组哈,下面会讲)
—:1,2,3,4
二:6,2,5,4
三:6,7,3,4
要记住只能错一个数字的情况哇,(下面会讲为啥是纠正一个错误,检查出两个错误的)
那么我们来看几种情况:
(1)如果第一组错误了,而第二第三组没有错误,是不是就排除了第二第三组的2,3,4,5,6,7了呢。所以错误是不是就是确定是1区域错了。
(2)如果第一第二组错了,而第三组没有错,看上图,只有一个是错误的话那就是结果2了。
(3)同理三组都错,是不是就确定了是4区域错了。
啊对对对,没错汉明码就是用了这一种思想来排除错误,操作方法就是异或。现在咱知道怎么检查错误了,这还不是纠错。
这里可能就有点难理解了,说以咱就一个字记,记不住就寄了,家人们!!!
汉明码=数据码+校验码。
假如有n个数据码,k个校验码,那么码错误的位置就会有n+k个,再加上一个没有错误的可能性,就有n+k+1种可能性。是不是!!
那么k的个数只要满足
即可
好!那么要传输数据码:1010的话,那就需要3个校验码,8 >= 4+3+1
我们先看校验码,我们规定校验码的位置放在2的i次方的位置,也就是1,2,4,8,16……
确定了位置之后就该把汉明码补完整(等得出整个汉明码之后才能检错和纠错),也就是说确定校验码的值,同时进行分组。
❗❗❗不同教材汉明码的顺序可能会不一样的,一些汉明码是编排顺序是左大右小H7~H1,这里讲述的是思想。不同编排顺序计算的结果是不同的。考试时要以自己相关教材为主❗❗❗
分组规则:
首先校验码的权位是按照 2^i 来划分的,分别是1,2,4,8,16.....,于是校验码的分组也是按照汉明码对应位置的权位来分组,看不懂没关系,上图
根据各自二进制位的权位,分别是2的2次方,2的1次方,2的0次方,也就是4,2,1。是上面校验码的位置,第四位(H4),第二位(H2),第一位(H1),再按照所在位是1的分组,这样子分组可以使每个成员如同上面圆圈图一般,有着相互的交集。(这个分组规则要记住)
于是得出各个组分别为:
p1:H4,H5,H6,H7
p2:H2,H3,H6,H7
p3:H1,H3,H5,H7
但是我们上面操作只是分好了组,还没有完整得出编码的值
于是我们要通过偶校验来确定校验码的值了
H5 H6 H7=1 0 1 得出:H4 = 0
H3 H6 H7=0 0 1 得出:H2 = 1
H3 H5 H7=0 1 1 得出:H1 = 0
于是整个汉明码就能确认 H1-H7依次为: 0100101
得知分组分别为(下面用p来表示第几组),以及汉明码为0100101分别对应H1~H7
p1 = H1 ^ H3 ^ H5 ^ H7 (^按位异或)
p2 = H2 ^ H3 ^ H6 ^ H7
p3 = H4 ^ H5 ^ H6 ^ H7
于是如上图异或结果得知假如编码完全正确,那么p1,p2,p3异或的结果都是0
如果p1 = 1,p2 = p3 = 0,(只错一个的情况下)那么就说明第二第三组都的成员2,3,4,5,6,7都没错,则H1错误,在明确得知只有一个错误的情况下,就可以知道H1的0变成1了,就可以自动改回来(这是一位纠错),而这个也刚好对应p1,p2, p3的数字,按照位权得出p3 p2 p1 =0 0 1。
再举个例子:p1= 1 p2=1 p3=0,按位权大小排列就是 011,是H3就是第一组和第二组的交集,也刚好对应错误的那一位......是不是很神奇?这就是汉明码设计厉害的地方
例子
我们利用分组也只能得出1位的错误,假如H1 H2 发生了跳变,按照分组
那么p1 =1,p2=1,p3 =0,
这是不是就说明011第三位发生错误呢?这显然是错误的
实现
于是为了检测两位错误,汉明码引进了一个全局校验码
根据汉明码0100101,加一位偶校验码 1 ,那么汉明码变为10100101,使偶校验为0
举个例子
当p1^p2^p3 ==1,而全体偶校验失败(变1),就说明有1位错误,把对应的位置纠正就可以
当p1^p2^p3 ==1,而全体偶校验成功(为0),就说明有2位错误,需重传
当p1^p2^p3 ==0,而全体偶校验成功(为0),就说明没有错误,完全正确
这就是汉明码不光能发现一位错误,还能明确知道其位置的原因,而且利用全校验码还能检测出两位的错误。这就是理查德·卫斯里·汉明这位伟大发明家的厉害之处了。
到这关于汉明码的全部用法就讲完啦,是不是觉得还挺有意思的, 快去实践一下吧