正算
看一张图
其中标绿底色的为汉明码校验位,可以发现,这些位置的2进制里面只有一个1,其他位上都是0。
先说结论:校验位上的1在第几个位上,就会用来保证位置的2进制里面该位上为1的位置上的1的个数为偶数。
比如:第一个位置,位置为1,二进制位为 0001,只有最后一位是1,则其他的位置的二进制值里面只要是最后一位是1的,都由第一位来校验。比如图里面的1111、1101、1011、1001、0111、0101、0011
这几个位置都要由第一个位置来校验。第二个位置,二进制为0010,倒数第二个位置上为1,则保证 1111、1110、1011、1010、0111、0110、0011. 好了明白了这个,下面来说怎么算。
比如要求 0110 1001
的汉明码(来源于教材里面第102页的例题)
第一步:先把数据右对齐,即从右边开始依次填入,如下
第二步:将所有值为1的位置的二进制值抄下来
如图里面分别是11、10、7、3位置上是1,则把1011、1010、0111、0011这四个二进制抄下来
如图所示
然后数每一列的1,如果为奇数的,则横线下面的结果为1,否则为0,如图中的第一列中有两个1,则第一列的结果就是0;第二列的1个数为1,是奇数,所以第二列的结果为1,依次类推
第三步:根据上面的结果,依次填入校验位中,即将0101这四个数依次填入8、4、2、1这四个位置中
得到结果是:0110 0100 1101
这个答案与教材上的答案是一致的
求错误位置
还是拿上面的例子来说,如果我们将第7位进行翻转,如下
把所有为1的位置的二进制抄下来,比如图里面是11、10、4、2、1的位置为1,则把其对应的二进制值抄下来
然后与正算里面第二步的方法一样,算出下面的结果来
则0111
这个值对应的位置7就是发生翻转的位置了