首页/计算机组成原理/02-data-representation/海明码(Hamming Code) 🔗 在 Obsidian 中打开
计算机组成原理 · 02-data-representation

海明码(Hamming Code)

重要度 ⭐⭐⭐⭐⭐海明码检错纠错伴随式SECDED
速查
校验位数满足 $2^r \geq k + r + 1$(k 数据位);校验位放 位号 $2^i$(1,2,4,8…);码距 3 → 检 2 位错、纠 1 位错;伴随式 $S_r\ldots S_1$ 的二进制值 直接指出出错位号;加 1 位全局校验位 → SECDED。

基本概念

海明码由 Richard Hamming 于 1950 年提出,是既能检错又能纠错的编码方式。核心思想:用 r 个校验位覆盖不同的数据位组合,通过校验结果(称为伴随式/症候字)定位错误位置。

基本参数关系

对于数据位 k 位、校验位 r 位,满足海明不等式:

$$2^r \geq k + r + 1$$

数据位 k校验位 r总码长 n=k+r$2^r$
1234
4378
841216
1652132
3263864
64771128

校验位位置

校验位 $P_i$ 放在位号为 $2^i$ 的位置(从 1 开始编号):

  • $P_1$ → 位号 1($=2^0$)
  • $P_2$ → 位号 2($=2^1$)
  • $P_4$ → 位号 4($=2^2$)
  • $P_8$ → 位号 8($=2^3$)

编码方法

校验位覆盖规则

每个校验位 $P_i$ 负责校验所有位号二进制表示中第 i 位为 1 的位置:

  • $P_1$(位号 1=001):覆盖位号 1,3,5,7,9,11,…
  • $P_2$(位号 2=010):覆盖位号 2,3,6,7,10,11,…
  • $P_4$(位号 4=100):覆盖位号 4,5,6,7,12,13,14,15,…
  • $P_8$(位号 8=1000):覆盖位号 8-15,24-31,…

手算示例

例 1:对数据 1010 进行海明编码(k=4, r=3, n=7)

Step 1:确定位置分配

位号7654321
类型D4D3D2P3D1P2P1
数据101?0??

Step 2:计算校验位(偶校验)

  • $P_1$ 覆盖 1,3,5,7:$P_1 = D_1 \oplus D_2 \oplus D_4 = 0 \oplus 1 \oplus 1 = 0$。
  • $P_2$ 覆盖 2,3,6,7:$P_2 = D_1 \oplus D_3 \oplus D_4 = 0 \oplus 0 \oplus 1 = 1$。
  • $P_4$ 覆盖 4,5,6,7:$P_3 = D_2 \oplus D_3 \oplus D_4 = 1 \oplus 0 \oplus 1 = 0$。

Step 3:编码结果

海明码 = 1010010

例 2:检错与纠错

接收码字 = 1011010(假设位号 4 出错,0 → 1):

  • $S_1 = P_1 \oplus D_1 \oplus D_2 \oplus D_4 = 0 \oplus 0 \oplus 1 \oplus 1 = 0$。
  • $S_2 = P_2 \oplus D_1 \oplus D_3 \oplus D_4 = 1 \oplus 0 \oplus 0 \oplus 1 = 0$。
  • $S_3 = P_3 \oplus D_2 \oplus D_3 \oplus D_4 = 1 \oplus 1 \oplus 0 \oplus 1 = 1$。

伴随式 $S_3S_2S_1 = 100_2 = 4_{10}$ → 位号 4 出错,取反即可纠正。

例 3:判断能否纠正

若 2 位同时出错(位号 4 和位号 6),伴随式可能恰好为 0 或其他值,无法正确纠错

编码效率

$$\eta = \frac{k}{k+r}$$

  • $k=4, r=3$:$\eta = \dfrac{4}{7} \approx 57\%$。
  • $k=8, r=4$:$\eta = \dfrac{8}{12} \approx 67\%$。
  • $k=64, r=7$:$\eta = \dfrac{64}{71} \approx 90\%$。

海明码的检错纠错能力

能力条件
纠 1 位错$2^r \geq k+r+1$
检 2 位错 + 纠 1 位错增加 1 位全校验位
码距标准海明码码距为 3:可以纠正 1 位错,或检出 2 位错(但不能同时做到)。

改进:SECDED 码

在标准海明码基础上增加 1 位全局奇偶校验位

  • 可纠 1 位错(Single Error Correction)。
  • 可检 2 位错(Double Error Detection)。
伴随式 S / 全局校验 P结论
$S=0, P=0$无错
$S \neq 0, P=1$1 位错,S 指出错误位置
$S \neq 0, P=0$2 位错,只能报告不能纠正
$S=0, P=1$校验位本身出错

记忆卡片

海明码校验位数量 r 满足什么条件?
$2^r \geq k + r + 1$。记忆:r 个校验位能表示 $2^r$ 种状态,需覆盖 k+r 个位置 + 1 种无错状态。
校验位放在哪些位置?
位号为 2 的幂次方的位置(1,2,4,8,16,…)。记忆:校验位占"好位置"——2 的幂。
如何定位错误位置?
伴随式 $S = S_r...S_2S_1$ 组成的二进制数就是出错的位号。记忆:伴随式直接当地址用。
SECDED 比标准海明码多了什么?
多了 1 位全局奇偶校验位,可区分 1 位错和 2 位错。记忆:加一层"总哨兵"。

交互动画 · 校验位覆盖与错误定位

例 1 编码结果 1010010(k=4, r=3, n=7),偶校验 位7位6位5位4位3位2位1 1010010 D4D3D2P3D1P2P1 覆盖规则: P1 覆盖 1,3,5,7 P2 覆盖 2,3,6,7 P3 覆盖 4,5,6,7
点击覆盖组查看每个校验位校验的位号;点击出错位号观察伴随式定位
点击按钮开始

相关知识点

parity-check-code

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。