#问题
设海明码的校验位数为,数据位数为,它们需满足一个位数公式
最初看到公式时我感到很疑惑啊,百思不得其解,主要的问题是最后那个1哪来的。
看着公式望了半天,一点头绪都没有,好脑袋不如烂笔头,于是我开始手写举例试着理解海明码的校验逻辑。
不写不知道,一写吓一跳。写着写着就发现了,原来这个1来的如此妖娆。
#引入(海明码原理介绍)
我们先来复习一下二进制的划分,假设现在有七位二进制数据,用序号来指向。为什么选择七位呢?因为它们的序号刚好可以用三位二进制来表示。
我们再来看看海明码的纠错方法。
表示序号的三个二进制位,每一个二进制位取值为1的序号个数都是4个(图中列标红)。这冥冥之中的平衡一定可以好好利用。
我们分别把二进制3-1列取值为1的序号纳入集合A、B、C。
则集合取值
A={7,6,5,4}
B={7,6,3,2}
C={7,5,3,1}
有一种大家很熟悉,校验一个序列值的方法叫做奇偶校验,偶校验计算方式是序列中所有值异或为0。
如果我们按照A、B、C的集合来分类,每个集合都进行偶校验,就可以得到3个偶校验值,它们需要等于0。由于是固定的,所以A、B、C需要作为校验位参与运算。也就是需满足
根据异或运算的性质,自己与自己本身异或为0。所以可以得到A、B、C的计算公式
海明码考虑的情况是一位纠错。当某一位出错后,A、B、C和它们对应集合数据位的异或就不再是本身与本身的异或,并且最终结果会变为1。
也就是说,接收到数据后,若,则表示A对应集合有一位元素数据位出错了(集合对应的元素就是一列中二进制表示为1的元素)。同理,最后运算结果为0的集合对应的元素是没有问题的,这样就可以筛查出是具体哪一位元素出错,从而进行纠错。
比如出错,那么A=1代表第一列元素出错,B=0代表第二列元素没错,C=1代表第三列元素出错。满足所有交集的元素只有一个,也就是被筛查出来的。可以看见这种方法非常直接,因为将ABC排列成二进制数,所代表的序号就是出错的那一位。
如下图,红色方块代表本列有出错元素,A列确定了,C列确定了,交集;而绿色方块代表一定没有出错的元素,B列排除了。随后就被筛选出来了。
#探明
在上面讲述海明码纠错过程中,可能有同学已经发现问题所在了。
我们新增了三位校验位,可是只对七位数进行了纠错。
所以公式里的那个1,其实来自于我们没有画出的序号0!
我们回望A、B、C的分类,每一集合都有4个元素,看似非常规律,似乎冥冥之中决定了我们可以使用海明码这样的纠错方式。
偏偏卦不可算尽,虽然每集合都有4个元素,但元素的分布律不是均等的,不仅不是均等的,还遗漏了一个0。
所以个校验位,虽然能表示个序号,但最终只能带来的纠错能力。
同时我们需要将校验位加入传输数据,也就是真正的有效数据需满足
#ps 会什么会少一个呢?其实很简单,只要理清楚概念。k个校验位,输出的序列(比如ABC),含义是第ABC(二进制)个序号的数值有错,而不是总共有多少个数字之类。所以看看000代表的含义就知道少掉的一种情况去哪了——它代表序列校验正确。
#pps 海明码校验位的位置在这个问题上没有啥作用,最初我觉得它一定有什么深层含义,想了半天也没想出什么
#ppps 或许以后有时间还可以写篇博客,叫做《海明码的哲学原理》。