代码改变世界

海明码计算

2018-11-04 22:24  NyaSu  阅读(810)  评论(0编辑  收藏  举报

 

海明码在计算的时候, 根据数的位置进行分组

例如在一个4位的数中, 将位置以二进制表示, 并分 xx1, x1x, 1xx三组(如上图)

然后为每组设置一个校验位

 

需要保证校验位数(r)+原位数要 小于 r位二进制能表示的位置 , 并且按照上面的分组原则, 还虚每组有一个校验位

即原数据为k位, 校验位为r位

k+r <= 2^r - 1 (因为从1开始计算位置, 所以需要减1)

如上例, 4 + 3 <= 2^3 - 1

 

加入校验位之后, 我们将校验位放在每组的最前边, 例xx1组, 就把校验位放在001的位置上, 对于一个校验位为4位的海明码来说, 他的分组和校验位如下:

第一个校验位校验xxx1组, 校验位位于0001(1)

第二个校验位校验xx1x组, 校验位位于0010(2)

第三个校验位校验x1xx组, 校验位位于0100(4)

第四个校验位校验1xxx组, 校验位位于1000(8)

对于任意位的海明码, 校验位总是位于2^n位上.

 

然后将原数据插入到非校验位的地方, 并根据新的位置, 计算每一组数据的校验和

例如第一组, 我们称校验位为P, 第一组的校验位为P1

P1则为第一组所有元素的偶(奇)校验和

其他组依据相同方法计算

 

在接收到数据之后, 我们对所有分组分别进行偶(奇)校验, 即可验证数据是否正确

 

对于1位的错误

假如错的是数据位, 则根据与其相关的所有校验位, 我们可以唯一确定错误的位置

假如错的是校验位, 则只有该组数据的校验位错误, 同样可以确定位置

 

后边写的还是不太清楚, 请参考维基百科https://zh.wikipedia.org/wiki/%E6%B1%89%E6%98%8E%E7%A0%81