彻底搞懂海明码1

318 阅读3分钟

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

复习计算机组成原理,一篇文章教你搞懂海明码。

海明码学习前提

记住不要用异或套用公式!

学习海明码之前,我们要约定3个原则:

  1. 海明码只能检测出2位错,纠1位错(因此不要问如果3位错怎么办等幼稚问题)。
  2. 海明码默认进行偶校验(除非特殊说明使用奇校验)。
  3. 海明码是一串由0和1组成的序列(除01外没有其他的值,记住了!这是重点)。

如果下面有任何无法理解的问题,反复看上面三个原则,下面再也不赘述。

前提:奇偶校验

奇校验:这串序列1的个数如果为偶数则在前面加个1,使1的个数变成奇数,否则加0。 偶校验:这串序列1的个数如果为奇数则在前面加个1,使1的个数变成偶数,否则加0。

例子:1111 奇校验就是 11111 偶校验就是 011111110 奇校验就是 01110 偶校验就是 11110

特性是检测一位错,无法纠错。

概述:海明码的构成

例如如下序列: 1100 我们想要让其变成海明码只需如下操作。

1.算出校验位数k

正常情况下我们需要如下此操作:

2^k >= k + 数据位数 + 1

这里等于3

2.确定校验位在海明码中的位置

这里按2^k次幂留出来,就像1,2,4,8,16,32。(如果问有5位等其他烦人的数据位怎么办后面我会说,先按4位数做)

H7H6H5H4H3H2H1
1100

3.分组(重点,很多人蒙圈就在此)

我们需要确认H1,H2,H4这三个校验位都来校验哪些位置。 我们按这个规则进行分配。

将1,2,4(海明码下标为1,2,4)

的二进制码写出来,并且最高位补到3位(前面算的K数) 如下所示:

124
001010100

然后我们将0替换为*,作为通配表

124
**111**

我们将1到7的二进制序列,列出来如下表

7654321
111110101100011010001

!!!重点!!!!

我们将7->1依次与上面的通配表进行匹配

124
**111**
001(1)010(2)100(4)
011(3)011(3)101(5)
101(5)110(6)110(6)
111(7)111(7)111(7)

因此我们可以确定 H1 负责 1 3 5 7 位数的校验 H2 负责 2 3 6 7 位数的校验 H4 负责 4 5 6 7 位数的校验