1.2.4 海明校验码
本节导学
海明码是本组三类校验方式中唯一需要重点掌握“纠错机制”的内容。字幕给出的核心非常明确:海明码通过多组分组校验形成交叉关系,当若干校验组同时报告异常时,交叉点就指向出错位;二进制位一旦定位,取反即可修正。
软件设计师考试不要求你完整推导每一个校验位的取值,但必须掌握两个入口规则:
| 内容 | 规则 |
|---|---|
| 校验位个数 | r |
| 校验位位置 | 放在第 1,2,4,8,16,... 位,也就是 |
为什么海明码能纠错
奇偶校验只有一条约束,发现错误时不知道是哪一位错。海明码把数据位放入多个校验组中,让同一个数据位同时参与若干组校验。这样一来,某一位出错时,会影响一组特定的校验位;这些异常校验位组合起来,就像坐标一样指向出错位置。
可以把它理解成“多组奇偶校验的交叉定位”。如果只知道“某一行出错”,不能定位;只知道“某一列出错”,也不够;但同时知道“第 2 行”和“第 4 列”出错,交叉点就出来了。海明码正是用二进制位序把这种交叉关系编码起来。
定位后,纠错动作很简单:错误位如果是 0 就改成 1,如果是 1 就改成 0。所以海明码的关键不是取反,而是通过校验结果找位置。
校验位个数公式
设信息位个数为 m,校验位个数为 r,海明码要满足:
取满足条件的最小 r。
r 个校验位能产生 2r 种校验结果。除了指示每一个可能出错的位置,还要能表示“没有错误”的情况,所以需要覆盖 m + r + 1 种状态。
从小到大试 r,只要第一次满足公式就停止。
例如 m = 32:r = 5 时左边 32,右边 38,不满足;r = 6 时左边 64,右边 39,满足,所以至少需要 6 位校验位。
再看字幕中的 m=16 示例:r=4 时 r=5 时
校验位插入位置
校验位放在位序为 2 的幂次的位置:第 1、2、4、8、16 位……其余位置依次放信息位。
这些位置的二进制编号只有一个 1,天然对应一个校验组。这样每个普通数据位都可以用自己的二进制位序同时落入若干校验组。
编号从 1 开始。先把第 1、2、4、8、16 位留给校验位,再把信息位按顺序填入剩余位置。注意:海明码的校验位是插入在数据中间,不是简单拼到末尾。
| 位序 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 内容 | P1 | P2 | D1 | P4 | D2 | D3 | D4 | P8 | D5 | D6 |
这正是海明码和 CRC、奇偶校验的结构差异:奇偶校验和 CRC 多是把校验位拼接在信息位前后;海明码的校验位插入在信息位之间,形成交叉覆盖关系。
位序二进制分解
某一位参与哪些校验组,可以通过它的位序二进制表示来判断:二进制中哪一位为 1,就参与对应的校验位。
这种设计让多个校验组的结果能够组合成一个二进制数,而这个二进制数正好是错误位的位置。
把该位置的位序拆成 2 的幂次之和。比如第 14 位:
所以它由 P8、P4、P2 参与校验。题目里也可能写成 P4、P3、P2 这种下标命名,本质仍然对应 8、4、2 这些位置。
再举第 10 位:
所以第 10 位参与 P8 和 P2 两个校验组。
与奇偶校验、CRC 的分工
| 对比项 | 规则 | 高频考法 |
|---|---|---|
| 校验位个数 r | 2r >= m+r+1 | 给信息位 m 求最小 r |
| 校验位位置 | 1,2,4,8,... | 判断某位是信息位还是校验位 |
| 覆盖关系 | 按位号二进制展开分组 | 判断某校验位参与哪些位 |
| 能力边界 | 经典海明码单错纠正、双错检测 | 与 CRC/奇偶能力对比 |
| 技术 | 位置组织 | 能力 | 为什么没有被简单替代 |
|---|---|---|---|
| 奇偶校验 | 校验位通常拼接 | 检奇数位错,不纠错 | 成本极低,适合简单检查 |
| CRC | 余数拼接在尾部 | 强检错,不纠错 | 通信中发现错误后可重传,不一定要本地修复 |
| 海明码 | 校验位插入 2 的幂次位 | 可检错、可纠错 | 冗余和规则更复杂,适合需要自动纠错的场景 |
做题路线
- 给出信息位
m时,从r=1开始试,取最小 r。 - 判断校验位位置时,牢记从 1 开始编号,位置是
1,2,4,8,16,...。 - 判断某个位置参与哪些校验组时,把位序写成二进制或拆成 2 的幂次之和。
- 能力对比题中,海明码是三者里唯一通常可纠错的;CRC 可检错但不可纠错;奇偶校验能力最弱。
🧪 例题(按难度)
简单(3题)
中级(3题)
例题1(求校验位个数)
对 32 位数据采用海明码,至少需要增加多少位校验位?
例题2(找规律:某位由哪些校验位校验)
某海明码位序从 1 开始计数,问第 10 位数据位参与哪些校验位的校验?
例题3(概念题)
下列关于海明码的叙述正确的是:
困难(1题)
📚 本课小结
- r 的求法:
2r >= m+r+1(取最小 r) - 校验位位置:1/2/4/8/16...
- 位序二进制分解:决定参与哪些校验组