汉明码
汉明码采用奇偶校验+分组校验的方式
奇偶校验
讲汉明码前先补充一下奇偶校验的知识
所谓奇偶校验就是提供一个冗余位用于检测编码是否出现异常,检测方式就是和名字一样检测1的个数如果采用偶校验如果1的个数为奇数那么校验位则位1这样就保证了1的总数为偶数,如果1的个数为偶数那么校验位为0;奇校验反之。
奇偶校验很显然只能检测奇数个出错的情况偶数个出错的情况无法检测
分组校验
汉明码的另一个特点就是分组校验!!!
为什么要分组呢,因为要实现纠错的功能就必须得要先找到这个出错的位置,如何查找?这其实可以类比算法中的二分查找。 现在有这么几个问题
1. 那么二进制如何进行二分呢?
二进制二分其实很容易因为每一位只有0或1两个选择那么二分就是以每一位为一组 比如: 第一组:XXX1 第二组:XXX1 第三组:X1XX 第四组:1XXX
2. 下一个问题我们应该分为几组呢?
我们需要考虑的有k个校验位,n个数据位,以及没有出错的情况1于是公式为
3. 那么二分中的mid是啥呢?
X为无关项,可以为0也可以为1,我们可以将X取0表示每一组的第一个数,其实也就是2^(i-1),用这个数来代表mid也就是汉明码中的校验位。 接下来我们以00110001110为例 首先找到校验位分别为1,2,4,8 那么我们可以得到这样的一个矩阵
4. 然后我们来思考这几个校验码具体应该是什么
对应的地址为
我刚刚说了汉明码的分组方式了
第一组:XXX1
我们可以得到这样的一个图像那么P1的值应该是以这一组进行偶校验得到的,现在1的个数为2个是奇数故P1=0
第二组:XX1X
由图可知P2=1
第三组:X1XX
由图可知P3=1
第四组:1XXX
由图可知P4=1
综上可知汉明码为010101110001110
检错功能
我们以上面的例子为例,现在已经得到汉明码为010101110001110,如果现在假如第12位发生了错误010101110000110
首先第一次二分
这里1的个数位偶数故这串数据要么没错要么在另一半发生了错误
接下来进行第二次二分
这里1的个数位偶数故这串数据要么没错要么在另一半发生了错误
现在错位范围已经缩小到了这四位
我们进行第三次二分
这里1的个数位奇数故这串数据出错了
现在范围缩小到了两位
现在进行第四次二分
这里1的个数位奇数故这串数据出错了
故最后将错误定位到了这位
以上流程用数学的方法来表示其实就是异或的一个过程
我们将所有信号为1的地址进行异或运算最终输出结果就是错误位的地址,因为如果这个信号是正确的那么最后的异或运算就全是0,这是多了一个由0->1的位参与了异或运算,那么一个数与0进行异或还是原来的数,故输出就是错误地址,假如他是由1->0也是同理0可以拆成两个相同的数进行异或运算,其中一个用于与其他1进行异或得到0,剩下一个与0异或输出错误地址
我们以这道题为例
最后引用路易斯巴斯德的名言:“运气眷顾有准备的人,聪明的想法往往看起来就具有间接甚至会让人们以为理所当然。”
聪明的想法看似简单是因为我们只看到了最终的结果,清理掉了过程,对其中的岔路一笔带过,也忽略了解决问题的伊始前路上无穷的可以探索的可能性。