Article

信息论-汉明码

整理汉明码的校验位数量、位排列、校验覆盖、综合征定位和 Hamming(7,4) 纠错流程。

April 28, 2026 修考 11 min read

[TOC]

这一节在讲什么

汉明码(Hamming Code)是一种典型的单比特错误纠正码。它的目标不是只判断“数据有没有错”,而是进一步定位“哪一位错了”,然后把那一位翻转回来。

普通奇偶校验只能发现错误,不能定位错误;汉明码通过插入多个校验位,让不同校验位负责不同位置,从而把校验结果组合成一个二进制编号。这个编号就是出错位的位置。

可以把汉明码的核心逻辑压缩成一句话:

校验位负责不同的位置集合,接收端得到的综合征就是错误位置的二进制编号。

一、校验位数量

设原始数据有 mm 个信息位,需要加入 pp 个校验位。发送的总位数为

n=m+pn=m+p

为了能够区分:

  1. 完全没有错误;
  2. 11 位出错;
  3. 22 位出错;
  4. \cdots
  5. nn 位出错;

校验结果至少要能表示 n+1n+1 种情况。因此校验位数量必须满足:

2pm+p+12^p \ge m+p+1

其中:

  • mm:数据位数量;
  • pp:校验位数量;
  • 11:表示“无错误”这一种额外情况。

例如,当 m=4m=4 时:

23=8,m+p+1=4+3+1=82^3=8,\qquad m+p+1=4+3+1=8

所以需要 p=3p=3 个校验位。这就是常见的 Hamming(7,4):总共 7 位,其中 4 位是数据位,3 位是校验位。

二、Hamming(7,4) 的位排列

汉明码的校验位放在 22 的幂次位置:

  • 11 位:202^0,放 p1p_1
  • 22 位:212^1,放 p2p_2
  • 44 位:222^2,放 p3p_3
  • 88 位:232^3,放 p4p_4,更长的汉明码才会用到。

对于 Hamming(7,4),位置安排如下:

位置1234567
类型p1p_1p2p_2m1m_1p3p_3m2m_2m3m_3m4m_4

也就是:

p1, p2, m1, p3, m2, m3, m4p_1,\ p_2,\ m_1,\ p_3,\ m_2,\ m_3,\ m_4

校验位之所以放在 1,2,41,2,4 这些位置,是因为这些位置的二进制表示只有一个 11,方便后面用综合征直接定位错误。

三、校验位负责哪些位置

汉明码的编号从 1 开始。把每一个位置写成二进制:

十进制位置二进制位置
1001001
2010010
3011011
4100100
5101101
6110110
7111111

每个校验位负责那些“对应二进制位为 1”的位置。

1. p1p_1 的覆盖范围

p1p_1 在第 1 位,对应二进制的最低位。因此它负责所有二进制编号最低位为 1 的位置:

1, 3, 5, 71,\ 3,\ 5,\ 7

也就是:

p1, m1, m2, m4p_1,\ m_1,\ m_2,\ m_4

2. p2p_2 的覆盖范围

p2p_2 在第 2 位,对应二进制的中间位。因此它负责:

2, 3, 6, 72,\ 3,\ 6,\ 7

也就是:

p2, m1, m3, m4p_2,\ m_1,\ m_3,\ m_4

3. p3p_3 的覆盖范围

p3p_3 在第 4 位,对应二进制的最高位。因此它负责:

4, 5, 6, 74,\ 5,\ 6,\ 7

也就是:

p3, m2, m3, m4p_3,\ m_2,\ m_3,\ m_4

用表格汇总:

校验位负责的位置位置规律
p1p_11, 3, 5, 7二进制最低位为 1
p2p_22, 3, 6, 7二进制中间位为 1
p3p_34, 5, 6, 7二进制最高位为 1

image-20260428185528675

image-20260428185650877

image-20260428195006537

四、偶校验下如何生成汉明码

下面默认使用偶校验:每个校验组中,11 的个数必须为偶数。

设 4 个数据位为:

m1m2m3m4=1011m_1m_2m_3m_4=1011

先把数据位放入 Hamming(7,4) 的数据位置:

位置1234567
类型p1p_1p2p_2m1m_1p3p_3m2m_2m3m_3m4m_4
数值??1?011

1. 求 p1p_1

p1p_1 负责第 1, 3, 5, 7 位:

p1, 1, 0, 1p_1,\ 1,\ 0,\ 1

已知的 11 有 2 个,已经是偶数,所以

p1=0p_1=0

2. 求 p2p_2

p2p_2 负责第 2, 3, 6, 7 位:

p2, 1, 1, 1p_2,\ 1,\ 1,\ 1

已知的 11 有 3 个,为了变成偶数,所以

p2=1p_2=1

3. 求 p3p_3

p3p_3 负责第 4, 5, 6, 7 位:

p3, 0, 1, 1p_3,\ 0,\ 1,\ 1

已知的 11 有 2 个,已经是偶数,所以

p3=0p_3=0

最终编码为:

位置1234567
数值0110011

所以发送的汉明码是:

01100110110011

五、综合征:如何定位错误

接收端重新检查每一组校验,得到三个检查结果:

  • S1S_1:检查 p1p_1 负责的组;
  • S2S_2:检查 p2p_2 负责的组;
  • S3S_3:检查 p3p_3 负责的组。

这里统一把综合征写成:

S3S2S1S_3S_2S_1

也就是高位在左,低位在右。这样它可以直接当成二进制数读取:

(S3S2S1)2=出错位置(S_3S_2S_1)_2=\text{出错位置}

如果综合征为 000000,表示没有检测到单比特错误。

综合征 S3S2S1S_3S_2S_1十进制位置含义
0000000无错误
0010011第 1 位出错,即 p1p_1
0100102第 2 位出错,即 p2p_2
0110113第 3 位出错,即 m1m_1
1001004第 4 位出错,即 p3p_3
1011015第 5 位出错,即 m2m_2
1101106第 6 位出错,即 m3m_3
1111117第 7 位出错,即 m4m_4

注意:如果你把综合征写成 S1S2S3S_1S_2S_3,就不能直接按这个表读位置。考试或做题时必须先确认综合征的书写顺序。

六、纠错例题

继续使用上面生成的码字:

01100110110011

假设传输后第 5 位发生翻转,接收端收到:

01101110110111

按位置写出:

位置1234567
接收值0110111

1. 计算 S1S_1

S1S_1 检查第 1, 3, 5, 7 位:

0, 1, 1, 10,\ 1,\ 1,\ 1

其中 11 的个数为 3,是奇数,所以

S1=1S_1=1

2. 计算 S2S_2

S2S_2 检查第 2, 3, 6, 7 位:

1, 1, 1, 11,\ 1,\ 1,\ 1

其中 11 的个数为 4,是偶数,所以

S2=0S_2=0

3. 计算 S3S_3

S3S_3 检查第 4, 5, 6, 7 位:

0, 1, 1, 10,\ 1,\ 1,\ 1

其中 11 的个数为 3,是奇数,所以

S3=1S_3=1

因此综合征为:

S3S2S1=101S_3S_2S_1=101

1012=510101_2=5_{10}

所以第 5 位出错。把第 5 位从 11 翻转回 00,得到正确码字:

01100110110011

再去掉校验位 1,2,41,2,4,保留第 3,5,6,73,5,6,7 位,恢复数据:

10111011

七、为什么这种设计能定位错误

关键在于每个位置都有唯一的二进制编号。例如第 5 位的编号是:

5=10125=101_2

这表示:

  • 最高位为 1,所以 S3S_3 会报错;
  • 中间位为 0,所以 S2S_2 不报错;
  • 最低位为 1,所以 S1S_1 会报错。

因此综合征就是:

S3S2S1=101S_3S_2S_1=101

它直接指向第 5 位。

换句话说,每个数据位都被一组独特的校验位覆盖。一旦某一位发生翻转,受影响的校验位组合也唯一,于是可以定位错误。

八、做题步骤

1. 编码步骤

  1. 根据 2pm+p+12^p\ge m+p+1 求校验位数量 pp
  2. 把校验位放在 1,2,4,8,1,2,4,8,\dots 这些位置;
  3. 把数据位填入剩余位置;
  4. 根据偶校验或奇校验求出每个校验位;
  5. 写出完整码字。

2. 解码与纠错步骤

  1. 按校验位分组重新检查;
  2. 得到 S1,S2,S3,S_1,S_2,S_3,\dots
  3. 按高位到低位写成综合征,例如 S3S2S1S_3S_2S_1
  4. 把综合征转成十进制,得到错误位置;
  5. 若综合征为 0,则认为无单比特错误;
  6. 若综合征不为 0,则翻转对应位置;
  7. 去掉校验位,读出原始数据。

九、常见易错点

  • 位编号从 1 开始,不是从 0 开始。
  • 校验位放在 1,2,4,8,1,2,4,8,\dots,不是随便插入。
  • 必须先确认使用的是偶校验还是奇校验
  • 综合征顺序要统一。本文使用 S3S2S1S_3S_2S_1,可以直接读成二进制位置。
  • Hamming(7,4) 可以纠正单比特错误,但不能可靠纠正多比特错误。
  • 表中 111111 对应第 7 位,也就是 m4m_4,不是 m3m_3

十、复习清单

  • 我能解释为什么校验位数量满足 2pm+p+12^p\ge m+p+1
  • 我能写出 Hamming(7,4) 的位置结构:p1,p2,m1,p3,m2,m3,m4p_1,p_2,m_1,p_3,m_2,m_3,m_4
  • 我能判断 p1,p2,p3p_1,p_2,p_3 分别覆盖哪些位置。
  • 我能用偶校验生成一个 Hamming(7,4) 码字。
  • 我能从接收码字计算综合征。
  • 我能把综合征转换成出错位置,并翻转对应比特。
  • 我能去掉校验位,恢复原始数据。
  • 我能说明汉明码只能纠正单比特错误的原因。

视频参考