彻底搞懂海明码2

140 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情

4.求出校验位是0还是1

因为上面我们得出以下结论:

H1 负责 1 3 5 7 位数的校验 H2 负责 2 3 6 7 位数的校验 H4 负责 4 5 6 7 位数的校验

那 根据

H7H6H5H4H3H2H1
1100
这张表,我们根据偶校验很容易就求出以下结论:
H3,H5,H7 1的个数为奇数 因此H1=1
H3,H6,H7 1的个数为偶数 因此H2=0
H5,H6,H7 1的个数为偶数 因此H4=0
至此我们得出了完整的汉明码
H7H6H5H4H3H2H1
1100001

5.查错

查错比较简单,如果以下三组 既 H1,H3,H5,H7 或者 H2,H3,H6,H7 或者 H4,H5,H6,H7 偶校验出错,则出错。

比方说 如果 H1,H3,H5,H7由1100 变成了 1110 (1的个数为偶数)就是出错了

这里该不赘述

6.纠错

首先我们先理解以下为什么海明码能纠错。 首先我们先画个圆。然后按如下形式做交叉 img

在每个相邻部位,我们做相加处理 img 变成了如下形式 img

当我们如果发现偶校验出错, 比方说在 1 3 7 5 这个区域出错。 img 如果这个位置出错了,那么一定是 1 3 7 5 这四个位置中的一个位置出错(如果俩位出错则无法纠错,这个点一定要记住) 如果此时其他的俩个组 即:2,3,6,7 和 4,5,6,7偶校验都通过了的话。 也就证明只可能是1出错 所以我们可以将 1 的位数 做修改。如果是0变为1,如果是1变为。来达到纠错的目的。

但是如果2,3,5,7这个位置也出错了,4,5,6,7这个位置没有出错。 我们很容易就推导出,是 3 这个位置出错了。

我们就可以修改3的值,如果是0变为1或者如果是1变为0.

在此时我们会发现一个巧妙的规则! 当我们把1,3,5,7 设为P1, 2,3,6,7设为P2 4,5,6,7设为P3时

当如果哪组校验失败就为1

P3P2P1出错(第几)位数
0011
0102
0113
1004
1015
1106
1117

刚好是对应的二进制编码。就是这么绝。

其实学完海明码之后,我真的觉得人家实在是太聪明了。

5位数数据

至此,其实如果认真看上面的部分,大家已经可以理解海明码是如何实现的了。 但是我还是再带大家写一次。这种5位数的。关键在于如何分组!!!!!

比方说 10001

先求出校验位数:

2 ^ k > = k + 5 + 1 则 k = 4

画出表格

将1,2,4,8位置空出来,再将数据位填进去

H9H8H7H6H5H4H3H2H1
10001

分组(*为通配符)

8421
1***1**1***1
8,94,5,6,72,3,6,71,3,5,7,9

偶校验每个分组得出结果

H9H8H7H6H5H4H3H2H1
110000110