这一部分在 408 风格里,最好不要把“奇偶校验、CRC、海明码”看成三块互不相干的零散知识,而是要抓住一条主线:码距决定检错/纠错能力,检错码负责发现错误,纠错码负责定位并纠正错误。从考研做题角度看,通常是按“码距 → 奇偶校验 → CRC → 海明码”这一条线来复习最顺。最核心的三个关系式是:若要检测 e 位错,则最小码距 d >= e + 1;若要纠正 t 位错,则最小码距 d >= 2t + 1;若既要纠错又要检错,则常用关系是 d >= e + t + 1(这里的 e 指额外还能检测出的错位数)。这些关系本质上都是围绕“合法码字之间必须拉开足够距离”展开的。(course.buct.edu.cn)
从这一点出发,三类编码的区别就很清楚了。奇偶校验码、CRC 属于检错码,重点是“发现错了没有”;海明码属于纠错码,重点是“发现后还能不能定位并改正”。因此,“数据链路层只能差错检测,不能差错纠正”这种说法如果按绝对化表述来判断,是错的。更准确的说法是:数据链路层的差错控制既包括检错也包括纠错;只是计算机网络教材和实际协议里,更常见的是 CRC 检错 + 重传,而不是把海明码作为主流链路层协议的核心机制。(CSDN博客)
奇偶校验码为什么总爱考“1 位错”和“奇数位错”
奇偶校验码最简单,只加 1 位校验位。若采用偶校验,就让“数据位 + 校验位”中 1 的总个数为偶数;若采用奇校验,就让总个数为奇数。它的本质不是“看哪一位错了”,而只是“看整体奇偶性有没有变化”。(华为云社区)
也正因为如此,奇偶校验码有两个非常高频的结论。
第一,一定能检出 1 位错误。因为只要有 1 位翻转,1 的总个数奇偶性一定改变,所以立刻能发现。
第二,凡是奇数位错误都能检出。原因和上面完全一样:每翻转 1 位,奇偶性就变一次;翻转奇数次,最终奇偶性一定改变,所以能发现。反过来,偶数位错误不一定能检出,因为翻转偶数次以后,整体奇偶性可能又回到了原来的状态。(华为云社区)
这一块最容易错的地方就在于,很多题目把“能检 1 位错”故意说成“只能检 1 位错”。这是错的。奇偶校验并不是只能发现 1 位错,而是能发现所有奇数位错,不能保证发现偶数位错。所以考试里看到“奇偶校验可检奇数位错”要立刻反应过来:这句话是对的;看到“奇偶校验可检任意 2 位错”就要立刻判错。
CRC 为什么是检错题的重头戏
CRC 是 408 里最重要的检错编码。它不是靠“数 1 的个数”,而是把二进制序列当作多项式,用生成多项式去做 模 2 除法。题目通常考四件事:
第一,已知数据和生成多项式,求 CRC 校验码。
第二,已知发送码字和生成多项式,判断有没有出错。
第三,已知接收序列,反推原数据和 CRC 位。
第四,辨析“余数为 0”到底表示什么。
CRC 的标准做法固定不变:
设原始数据为 M,生成多项式为 G(x),其最高次幂为 r。
先在 M 后补 r 个 0,得到 M·2^r。
再用它去除以对应的生成多项式二进制串,得到余数 R。
最后发送码字就是 T = M || R。
接收端拿收到的序列再去除以生成多项式,如果余数为 0,就说明未检测到差错。注意,这里只能说“未检测到差错”,不能绝对说“传输一定完全正确”。(博客园)
这里最容易错的点有两个。一个是把普通减法当成 CRC 除法,实际上 CRC 用的是模 2 除法,也就是“同 0 异 1”,本质是异或。另一个是把“余数为 0”理解成“绝对没错”,这也不严谨。CRC 只是检错能力很强,不是数学上绝对不会漏检。
海明码为什么属于纠错编码
海明码和前面的检错码不一样,它的重点已经不是“有没有错”,而是“错在哪一位”。它通过在若干特殊位置插入校验位,让每一个数据位都落在一组独特的校验关系中。接收端重新计算这些校验关系后,会得到一个“综合校验结果”,也就是常说的校验子或综合症,这个结果可以直接指出哪一位出错。(西安交通大学)
考研里最常用的海明码结论有两个。
一个是校验位个数公式。若信息位有 m 位,校验位有 r 位,则应满足:
2^r >= m + r + 1
这条式子一定要会用,因为“给定数据位数,求至少加多少位校验位”是海明码最常见的计算题。(西安交通大学)
另一个是海明码和码距的关系。标准海明码常按“纠正 1 位错”来理解;从最小码距角度看,它对应的是最小码距为 3 的思路,所以它与“单错纠正”紧密相关。国内考试语境里,通常直接记成“海明码能纠 1 位错”。(ci.tongji.edu.cn)
例题 1:“数据链路层只能提供差错,而不能提供差错纠正”对还是错
这句话按考研判断应为:错。
原因不是很复杂。数据链路层的“差错控制”本来就包括两部分:检错和纠错。CRC、奇偶校验码属于检错,海明码属于纠错。只是从计算机网络协议的主流做法来看,链路层更常见的是“发现出错以后重传”,而不是像信道编码那样大量采用前向纠错。所以教材里常给人一种“链路层主要做检错”的印象,但不能直接说“链路层不能纠错”。(CSDN博客)
这类判断题的陷阱就在“只能”二字。只要题干用了绝对化表述,就要提高警惕。
例题 2:纠正 2 比特错误,码距至少是多少
设要纠正 t = 2 位错误。根据纠错能力公式:
d >= 2t + 1
所以:
d >= 2×2 + 1 = 5
因此答案是:最小码距至少为 5。(course.buct.edu.cn)
这题非常基础,但很容易和“检测 e 位错需要 d >= e + 1”混掉。看到“纠正”二字,脑子里必须立刻切到 2t + 1。
例题 3:10 位数据采用海明码,需要增加多少位冗余位
设数据位 m = 10,校验位 r 满足:
2^r >= m + r + 1
代入可得:
当 r = 3 时,2^3 = 8 < 10 + 3 + 1 = 14,不满足。
当 r = 4 时,2^4 = 16 >= 10 + 4 + 1 = 15,满足。
所以至少需要增加 4 位冗余信息位。(西安交通大学)
这类题就是纯代公式,几乎没有技巧,关键是别把不等式写错。
例题 4:某差错编码的编码集为 {10011010, 01011100, 11110000, 00001111},其检测和纠错能力是多少
你这道题原文里有些分隔符明显被识别乱了,按最常见题型,应理解为这 4 个 8 位码字构成一个编码集。做法是先求最小码距。
两两比较可得:
d(10011010,01011100)=4d(10011010,11110000)=4d(10011010,00001111)=4d(01011100,11110000)=4d(01011100,00001111)=4d(11110000,00001111)=8
所以最小码距 d = 4。
于是:
若只谈检错能力,则可检 d - 1 = 3 位错。
若只谈纠错能力,则可纠 floor((d - 1)/2) = 1 位错。
若题目要求“同时具有的检错和纠错能力”,则满足 d >= e + t + 1。代入 d = 4,可得一种标准表述是:纠正 1 位错,同时检测 2 位错。(course.buct.edu.cn)
这类题最容易错在最后一句。很多同学算出 d=4 后,只会答“检 3 纠 1”,其实这两个说法分别对应“只检错模式”和“只纠错模式”。若题干强调“检测和纠错能力”,最好把三种说法都交代清楚,最稳。
例题 5:收到比特序列 10110011010,生成多项式为 G(x)=x⁴+x³+1,判断是否出错;若未出错,求原数据和 CRC 码
你题目里写成了 G(x)=x+x+1,这在 CRC 题里显然不成立。结合这道题的常见原题,应当是:
G(x) = x^4 + x^3 + 1
对应二进制除数为 11001。这个题型本身在常见题库里就是这样出的。(牛客网)
先验证收到的序列 10110011010 是否出错。
做模 2 除法:
10110011010 ÷ 11001
按异或除法继续做下去,最后余数为:
0000
所以结论是:未检测到差错。(牛客网)
既然生成多项式最高次幂是 4,那么 CRC 校验位长度就是 4 位。因此收到的 11 位码字可以拆成:
原始数据:前 7 位 1011001
CRC 校验码:后 4 位 1010
还可以反向验证一次:
把原数据 1011001 后补 4 个 0,得到 10110010000;
再用 11001 去除,余数恰好为 1010;
因此发送码字就是:
1011001 || 1010 = 10110011010
与接收序列一致,所以答案成立。(牛客网)
最后把这一章压成一个做题模板
这一章最适合记成下面这套判断顺序。
先看题目是在问检错还是纠错。
如果是奇偶校验,立刻想到:检 1 位没问题,检任意奇数位没问题,偶数位不保证。(华为云社区)
如果是 CRC,立刻想到:补零、模 2 除、取余数、拼接码字、接收端再除。(博客园)
如果是海明码,立刻想到:先算校验位个数 2^r >= m + r + 1。(西安交通大学)
如果题目给了一组码字,立刻想到:先求最小码距,再套 检错 d-1,纠错 floor((d-1)/2)。(course.buct.edu.cn)



