汉明码是什么
汉明码是一种具有一位纠错能力的二进制代码
简单点来说就是,如果你接收到一个二进制数字串,这个二进制数字串是符合汉明码规则的。那么如果这个数字串出错了,0变成了1,1变成了0;你可以利用汉明码的规则发现并纠正这个错误。(注意:汉明码只具有一位纠错能力)
汉明码的检测位
想要检测的二进制代码有n位,想让它具有纠错能力,成为汉明码,就需要给它增添k个检测位,组成n+k位二进制代码。其中这个k应该满足:
2^k >= n+k+1
当然在考试中也可以直接记表
n | k |
---|---|
1 | 2 |
2~4 | 3 |
5~11 | 4 |
12~26 | 5 |
知道了该有几个检测位,那么检测位该在哪一个位置呢?
如果有3个检测位:1,2,4号位上
如果有4个检测位:1,2,4,8号位上
如果有5个检测位:1,2,4,8,16号位上
…
相信你已经看出规律了
ok检测位的个数和位置你已经清楚了,接下来就是检测位的取值,是0还是1
在汉明码中有对检测位 gi 的规定有如下三条
- 每一个小组独占自己检测位的那一位,也就是 gi 占第 2i-1 位
- 每两个小组 gi 和 gj 又分别独占一位,也就是 2i-1 + 2j-1位
- 每三个小组 gi gj gk 又分别共同占一位 ,即2i-1 +2j-1 +2k-1
举例:k为4的情况
既是有4个检测位,这三个检测位分别在1号,2号,4号,8号位置上。
(从左到右,从1开始计数,记作为C1 C2 C4 C8)
C1:1,3,5,7,9,11,
C2:2,3,6,7,10,11,14
C4:4,5,6,7,12,13,14
C8:8,9,10,11,12,13,14
计算过程:
可以先把各组独占的写出来,这里有1,2,4,8
然后,Ci与其他各组的一个相加,Ci与其他两个相加
C1:C1,C1+C2,C1+C3,C1+C4,C1+C2+C3,C1+C2+C4,C1+C3+C4…
最后去掉重复的号位。
接下来就是各个检测位的取值:
配偶原则,让各组检测位中 1 的个数为偶数个。
举例:C1:1,3,5,7
C1是占着1号位,需要让1,3,5,7号位上面1的个数成偶数个,
0100101
上面这串汉明码中, 3号位取0,5号位取1,7号位取1,已经是2个1了,所以C1就取0
当然也可以用异或运算来实现(相同为0,不同为1)
C1 = 一号位 ⊕ 三号位 ⊕ 五号位
C1 = 0⊕1⊕1=0
例题:配置0101的汉明码?
解答:0100101
(注:配置汉明码,要先放检测位 ||C1,C2,0,C4,1,0,1||)
汉明码如何纠错
汉明码的纠错过程,实际上就是对送过来的汉明码形成新的检测位,通过这个新的检测位来确定出错的位置。
我们知道,检测位所在小组的取值要保证 1 的个数为偶数个,我们要做的就是,把接受到的汉明码,再求一下检测位是否正确,若我们发现检测位对应小组中 1的个数为奇数个,那肯定就是出错了。
例题:
已知传送后接收到的汉明码(按照配偶原则)为0100111,正确的汉明码是?
解:
新检测位:
P1= 1⊕3⊕6⊕7 = 0⊕1⊕1⊕1= 1
P2= 2⊕3⊕6⊕7 = 1⊕0⊕1⊕1= 1
P4= 4⊕5⊕6⊕7 = 0⊕0⊕1⊕1= 0
错误位在6号,正确的汉明码是0100101
(注:P1和P2同时不为零,说明有一个错位是两个组都包含,但P4组不包含的,推断可以知道是6号位。 其实更简单的做法就是P4P2P1,高位到地位写出来:110
这个二进制数对应的就是6,也就是出错的地方)
最后还有一种,是按照配奇原则的汉明码,和上面类似,只要保证各小组 1 小组个数是奇数个就好了。
1100101按照配奇原则配置汉明码为 11101001101