Appearance
海明码详解
考情分析
海明码是 408 数据表示章节的高频考点,大题和选择题都会出。常考题型:给定数据位求校验位数量、写出各校验位的值、给定接收码判断是否出错并纠正,以及 SEC-DED 方案的判断逻辑。
海明码的核心思想
海明码在数据位之间插入若干校验位,使码距
精妙之处在于:每个数据位被分配到多个校验组中,出错时各校验组的结果拼起来直接给出出错位的编号。
校验位数量
设数据
| 数据位 | 校验位 | 总码长 |
|---|---|---|
| 1 | 2 | 3 |
| 4 | 3 | 7 |
| 8 | 4 | 12 |
| 16 | 5 | 21 |
| 32 | 6 | 38 |
| 64 | 7 | 71 |
校验位的位置
校验位放在编号为
以
| 位编号 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 内容 |
分组规则
校验位
7 位海明码中,各位编号的二进制表示:
| 位编号 | 二进制 | 属于校验组 |
|---|---|---|
| 1 | 001 | |
| 2 | 010 | |
| 3 | 011 | |
| 4 | 100 | |
| 5 | 101 | |
| 6 | 110 | |
| 7 | 111 |
各校验组的覆盖范围:
| 校验位 | 覆盖位编号 | 覆盖的数据/校验位 |
|---|---|---|
| 1, 3, 5, 7 | ||
| 2, 3, 6, 7 | ||
| 4, 5, 6, 7 |
编码过程
对每个校验组做偶校验(该组所有位含校验位自身的异或为 0):
检错与纠错
接收端对每个校验组重新计算偶校验,得到故障字(syndrome)
故障字的值 = 出错位的编号:
| 故障字 | 含义 |
|---|---|
000 | 无错误 |
001 | 第 1 位( |
010 | 第 2 位( |
011 | 第 3 位( |
100 | 第 4 位( |
101 | 第 5 位( |
110 | 第 6 位( |
111 | 第 7 位( |
将对应位取反即完成纠错。
为什么 syndrome 恰好等于出错位编号? 因为出错位参与了哪些校验组,那些组的 syndrome 就为 1。把各组的 syndrome 拼起来,正好是该位编号的二进制表示——这就是海明码位置编排的巧妙之处。
SEC-DED:全校验位扩展
标准海明码只能纠 1 位错。如果 2 位同时出错,故障字非零但指向一个错误的位置,"纠正"反而引入第 3 个错误。
解决方案:增加 1 位全校验位
| 故障字 | 判断 | 处理 | |
|---|---|---|---|
| 正确(0) | 全 0 | 无错误 | 无需处理 |
| 出错(1) | 非 0 | 1 位错 | 按故障字纠正 |
| 正确(0) | 非 0 | 2 位错 | 报告错误,不纠正 |
| 出错(1) | 全 0 | 纠正 |
这就是 SEC-DED(Single Error Correction, Double Error Detection)方案。实际内存的 ECC 就是基于这个原理——72 位码字(64 位数据 + 8 位校验)实现 SEC-DED。
交互可视化
例题
例 1:对数据
| 位编号 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 内容 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
海明码 = 1010101。
例 2:接收到 1010001(原发送 1010101,位 3 出错),检错并纠正。
| 位编号 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
|---|---|---|---|---|---|---|---|
| 收到 | 1 | 0 | 1 | 0 | 0 | 0 | 1 |
故障字
将第 3 位取反:1010101,恢复正确。
例 3:8 位数据至少需要多少位海明校验位?SEC-DED 方案呢?
标准海明码:4 位校验位,总码长 12。
SEC-DED:加 1 位全校验位
考点清单
- [ ] 校验位数量公式:
- [ ] 校验位放在第
位 - [ ] 分组规则:位编号二进制中第
位为 1 则归入 组 - [ ] 编码时对各组做偶校验求校验位
- [ ] 故障字 = 出错位编号(全 0 表示无错)
- [ ] 标准海明码:
,纠 1 位或检 2 位(二选一) - [ ] SEC-DED:加全校验位
, ,同时检 2 纠 1