携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情
复习计算机组成原理,一篇文章教你搞懂海明码。
海明码学习前提
记住不要用异或套用公式!
学习海明码之前,我们要约定3个原则:
- 海明码只能检测出2位错,纠1位错(因此不要问如果3位错怎么办等幼稚问题)。
- 海明码默认进行偶校验(除非特殊说明使用奇校验)。
- 海明码是一串由0和1组成的序列(除01外没有其他的值,记住了!这是重点)。
如果下面有任何无法理解的问题,反复看上面三个原则,下面再也不赘述。
前提:奇偶校验
奇校验:这串序列1的个数如果为偶数则在前面加个1,使1的个数变成奇数,否则加0。 偶校验:这串序列1的个数如果为奇数则在前面加个1,使1的个数变成偶数,否则加0。
例子:1111 奇校验就是 11111 偶校验就是 01111。
1110 奇校验就是 01110 偶校验就是 11110。
特性是检测一位错,无法纠错。
概述:海明码的构成
例如如下序列:
1100
我们想要让其变成海明码只需如下操作。
1.算出校验位数k
正常情况下我们需要如下此操作:
2^k >= k + 数据位数 + 1
这里等于3
2.确定校验位在海明码中的位置
这里按2^k次幂留出来,就像1,2,4,8,16,32。(如果问有5位等其他烦人的数据位怎么办后面我会说,先按4位数做)
| H7 | H6 | H5 | H4 | H3 | H2 | H1 |
|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 0 |
3.分组(重点,很多人蒙圈就在此)
我们需要确认H1,H2,H4这三个校验位都来校验哪些位置。 我们按这个规则进行分配。
将1,2,4(海明码下标为1,2,4)
的二进制码写出来,并且最高位补到3位(前面算的K数) 如下所示:
| 1 | 2 | 4 |
|---|---|---|
| 001 | 010 | 100 |
然后我们将0替换为*,作为通配表
| 1 | 2 | 4 |
|---|---|---|
| **1 | 1 | 1** |
我们将1到7的二进制序列,列出来如下表
| 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|
| 111 | 110 | 101 | 100 | 011 | 010 | 001 |
!!!重点!!!!
我们将7->1依次与上面的通配表进行匹配
| 1 | 2 | 4 |
|---|---|---|
| **1 | 1 | 1** |
| 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 位数的校验