
拿到2025年6月这套三级真题的第二套卷子大多数人扫到“奇偶校验”四个字都会松一口气觉得又是一道送分题。但真等分数出来这道题的失分率一点都不低。奇偶校验的规则确实简单给你一串二进制数据补一个校验位让整段码字里的1的个数满足约定的奇偶性。可越简单的规则越容易在执行时出现致命的小偏差——奇校验和偶校验记反了校验位放在最高位还是最低位没看清统计1的时候漏掉了补零位。更扎心的是很多人算对了校验位却忘记了校验位本身也要参与接收端的整体统计结果一道10分的题硬生生被扣得只剩3分。这篇文章我就围绕这套真题里奇偶校验的部分把命题逻辑、手工计算方法、两类常见题型、硬件和代码实现以及考场上的边界情况完整过一遍。无论你是第一次备考三级等级考试还是已经刷完一轮题但总在细节上卡壳我都建议你先把自己代入这道题从头算一遍。1. 这道奇偶校验题到底想考什么1.1 题干藏在三个关键信息里三级考试里的奇偶校验题题干通常不会太长但每个字都有用。核心信息包括三个数据位宽度、校验方式、校验位位置。我拿一个通用表述来还原这道题的典型结构给出8位数据10110001采用偶校验校验位放在数据末尾写出完整的传输码字。如果接收端收到一个码字如何判断传输是否有误。很多考生只注意“偶校验”这三个字其余条件一扫而过。比如“8位数据”意味着不足8位时需要补零补零不是装饰它是数据的一部分统计1的个数时必须把这部分算进去。再比如“校验位放在数据末尾”这决定了你在写完数据位之后把算出来的校验位追加在最后而不是插在中间也不是放在最前面。这类细节一旦看漏最终写出来的码字顺序就是错的后面的判错题也会跟着错。1.2 命题人实际上设置了三个层次从阅卷角度回看这套题它其实不是让你背一个定义而是考察三个层次的能力。层次具体考法典型分值容易失分的点第一层根据数据位计算校验位2-3分奇偶规则记反、统计个数出错第二层把数据位和校验位组装成完整码字2-3分校验位位置写错、位数写错第三层用奇偶规则判断接收码字是否正确3-4分忽略校验位本身、误认为能定位错误第一层考察的是基本计算第二层考察的是表达规范第三层考察的是对“检错”概念的理解。前两层靠细心能守住第三层则需要知道奇偶校验的边界它只能告诉你有没有错不能告诉你哪里错也不能发现偶数个bit同时翻转。1.3 为什么三级考试偏爱奇偶校验从整个知识体系来看三级考题中差错控制部分通常会安排一条由浅入深的线奇偶校验、纵向冗余校验、循环冗余校验、海明码。奇偶校验之所以被放在最前面是因为它的思想足够干净通过增加一个冗余位让整段码字满足某种数学规则接收端用相同规则来检查这段数据是否被破坏。这个思想是所有校验技术的基础。考试如果直接考复杂的校验算法考生未必能在有限时间内完成计算所以选择奇偶校验来检验你是否具备最基本的“冗余规则验证”思维是一个性价比很高的命题方式。这也是为什么这道题分值虽小却每年都值得拿出来单独复盘。2. 校验位怎么算规则、实例和三个易错点2.1 计算本质是一次模2加法奇偶校验的计算不用背复杂公式你只需要记住统计数据位里1的个数然后凑数。偶校验要求数据位加校验位后整段码字中1的总数为偶数。奇校验则要求总数为奇数。校验位只能取0或1所以计算规则可以写得很直白偶校验时校验位 数据位中1的个数对2取余。如果数据位里1的个数是奇数校验位补1让总数变成偶数如果1的个数本来就是偶数校验位补0。奇校验时校验位 1减去数据位中1的个数对2取余。数据位里1的个数是奇数校验位补0保持总数是奇数如果1的个数是偶数校验位补1。这里有一个很多人反复绕晕的地方不要单独去看校验位本身是0还是1你只需要关心“补完之后整段码字的1是不是满足约定”。2.2 用一张表练出手感我们随便列几组数据把偶校验位和奇校验位都算出来数据位数据位中1的个数偶校验位奇校验位完整码字校验位在末位偶校验010101031001010101101100140110110010111000031011100001000000000100000000把这张表对着算一遍你会发现并不需要每次重新发明轮子。考试时直接在草稿纸上画三列数据位、1的个数、校验位。所有步骤的过程都留在纸上哪怕最后结果错了阅卷老师也能看到你的思路步骤分还能保住一部分。2.3 三个被考生反复踩中的坑第一个坑是统计时漏看位宽。题目写8位数据但给你的二进制串可能看起来只有7位比如1011001。你很容易直接数里面四个1忘记这是8位数据正确写法是01011001前面那个补上的0也算一位只是它不影响1的个数。更隐蔽的情况是题目给的数据本身以0开头比如0011这时候就不要只按4位来看还是要回到题干要求的位宽去统计。第二个坑是把“偶校验”记成“校验位必须是偶数”。偶校验看的是整段码字1的总数不是校验位本身是0还是1。比如数据位1011001有四个1已经是偶数偶校验位就是0如果数据位变成1011011有五个1偶校验位反而要补1。死记“偶校验位等于0”这类口诀遇到奇数个1的数据就会出错。第三个坑是校验位位置处理不一致。算出的校验位只是一个二进制数它放在数据末尾还是数据开头会得到完全不同的码字。以数据1011001偶校验位0为例放在末尾是10110010放在开头是01011001。题目如果明确说“校验位放在数据位之后”你就必须写10110010。3. 两类真题答法从生成码字到接收端判错3.1 第一类给定数据位写完整码字这种题的完整操作可以拆成三步。假设题干是数据位1100110采用偶校验校验位放在数据末尾写出完整码字。第一步数数据位中1的个数。1100110从高到低看1、1、0、0、1、1、0总共四个1。第二步按校验模式确定校验位。偶校验要求完整码字里1的总数为偶数数据位已经有四个1已经是偶数所以校验位补0。第三步把校验位放到指定位置写出完整码字11001100。写完可以做一个快速自查11001100里数一下还是四个1偶数满足偶校验这道题的答案没问题。再举一个奇校验的例子。数据位1011011数一下有五个1。奇校验要求完整码字中1的总数为奇数五个1已经是奇数所以奇校验位补0完整码字是10110110。如果同样这道题改成偶校验校验位就要补1完整码字变成10110111。通过这一组对比可以看出奇偶模式不同最终码字也不同答题前一定要先圈出题目里的“奇”或“偶”。3.2 第二类给接收码字判断是否有错接收端的判断逻辑更直接把包括校验位在内的整段码字重新统计一遍看看1的个数是否符合约定。约定偶校验接收端收到11001100统计整段码字有四个1偶数判定本次传输没有发现错误。约定偶校验接收端收到11001101统计整段码字有五个1奇数判定本次传输出现错误。这里要特别强调一个关键点统计时校验位必须算进去。有些考生在算校验位时知道要把校验位加进去凑偶数等到了接收端判错的时候反而只统计数据位忘了校验位也参与传输。一旦漏掉这一位任何判断都会偏离正确结果。我们再举一个一眼看过去像“错了”但实际是“对”的情况。假设约定偶校验接收端收到10110010数据位是1011001校验位是0。统计整段码字四个1偶数判定无误。很多人会怀疑多了一个校验位会不会导致奇偶性变化其实校验位正是为了让整段码字满足约定才补出来的所以接收端永远要把校验位一起统计。3.3 答题的书面规范值得刻意练习三级考试是笔试环境最终写在答题纸上的过程比答案本身更值钱。我的建议是每道题都按固定格式写先写“数据位中1的个数N几”再写“按偶校验/奇校验要求校验位P几”然后写“完整码字为...”最后写“接收端重新统计整段码字得到M个1M为奇数/偶数因此判断无误/有误”。这种写法有四个好处逻辑清楚、步骤完整、阅卷老师容易给步骤分、出错了也方便你自己回头查。别觉得啰嗦试卷上明确要求“写出计算过程”的时候这一步基本就是刻意送分。4. 从真题到可验证的实现异或门、C函数和串口协议4.1 异或门天然就是奇偶校验生成器考试不会只考数据计算偶尔还会让你画一个校验位生成电路。这时候如果你知道异或门回答起来会非常轻松。异或门的逻辑是输入相同则输出0输入不同则输出1。当多个输入经过级联异或之后输出结果恰好代表所有输入中1的个数的奇偶性——奇数个1时输出1偶数个1时输出0。而偶校验位的要求正是如果数据位里1的个数是奇数校验位就补1如果数据位里1的个数是偶数校验位就补0。这不就是异或输出的和校验位完全一致吗所以画偶校验生成电路最简单的方式就是把所有数据位送进级联异或门输出的结果直接当校验位。如果要生成奇校验位在偶校验位电路后面再接一个非门把输出取反即可。这个知识点在纸面上看是电路题本质还是奇偶校验的另一种表达方式。理解了异或门和校验位的关系以后再遇到类似“奇偶校验生成器”的题目画图就不慌。4.2 用C语言写一个可复用的校验函数如果你习惯用程序验证原理可以写一个非常简单的函数。以下代码把整个计算过程完整表达了出来#include stdio.h unsigned char parity_bit(unsigned char data, unsigned char mode) { unsigned char cnt 0; for (int i 0; i 8; i) { cnt cnt ((data i) 1); } if (mode 0) { // 偶校验 return cnt % 2; } else { // 奇校验 return 1 - (cnt % 2); } } int main(void) { unsigned char data 0xB3; // 二进制为 10110011 printf(偶校验位: %d\n, parity_bit(data, 0)); printf(奇校验位: %d\n, parity_bit(data, 1)); return 0; }这段代码做的事情很简单用循环把数据的每一位取出来统计1的个数再根据偶校验或奇校验返回对应校验位。(data i) 1的写法是移位后再按位与1作用是把第i位单独拎出来参与计数这也是位操作里最常用的技巧。跑一下这个程序数据0xB3也就是10110011里面有五个1所以偶校验位会返回1奇校验位会返回0。你可以自己改数据来验证前面表格里的每一组结果。如果在支持GCC的环境里也可以直接用编译器内置函数来判断奇偶性比如使用内置的parity指令。但考试和面试里我仍然建议你手写循环因为只有手写才能体现出你真的理解这个过程而不是只会调用工具。4.3 串口协议中的奇偶校验就是这套题的实战场景真题的知识点往往不是凭空造的奇偶校验在串口通信里就有非常典型的应用。UART协议在发送一帧数据时会在数据位之后带上一个校验位接收端收到后按照规定好的奇偶模式进行验证。实际工程中校验位放在数据位之后一般约定偶校验或奇校验由通信双方事先确定。发送端根据数据内容计算校验位并填到帧里接收端把整帧数据统计一遍看1的个数是否满足约定。如果发现校验失败接收端通常的做法是丢弃这一帧或者请求重发。很多人在理解串口奇偶校验时会以为接收端能把出错的bit找出来并改正。这是不正确的。奇偶校验只提供“对/错”的二元判断它没有能力告诉你哪一位错了。真实的串口场景里一个bit翻转是常见错误模型所以一个校验位能覆盖大部分情况。如果错误模型变成多个bit随机翻转就需要更复杂的校验方式。5. 检错边界与考场上的三个提醒5.1 奇偶校验只对奇数个bit错误生效这是一道真题最容易延伸出来的隐藏考点。奇偶校验能发现错误的条件是传输过程中发生奇数个bit翻转。为什么因为一个bit翻转会让整段码字中1的个数从偶数变成奇数或者从奇数变成偶数奇偶性随之改变接收端检查时就能发现。可如果有两个bit同时翻转1的个数会经历两次变化奇偶性最终保持原样接收端就会认为这段码字没有错误。传输过程中错误bit数量整段码字1的个数奇偶性奇偶校验能否发现1个改变能2个不变不能3个改变能4个不变不能拿上一节的偶校验码字11001100来看里面四个1。如果第一个1和第二个1同时翻转成0码字变成00001100仍然只有两个1偶数。接收端按偶校验检查会判定无误但数据已经被破坏了。这个边界条件不是考试非要为难你而是它直接反映了奇偶校验的局限性。懂得了这个局限你才能理解为什么后面还有CRC、海明码这些更复杂的校验方式。5.2 检错和纠错是两个概念很多考生在答题时容易把“发现错误”和“纠正错误”混在一起这是一道明显的丢分点。奇偶校验明确只检错不纠错。检错是说接收端能知道这帧数据有问题但不知道是第几位出了问题。纠错则要求接收端能够定位错误位置甚至把错误位恢复成原始值。要做到定位和纠正需要引入更多的冗余信息。如果题目问“奇偶校验能否纠正一位错误”答案就是不能。我在阅卷时看到不少人写“可以纠正一位错”估计是把海明码和奇偶校验记混了。海明码确实能够纠错但它的成本是多个冗余位和奇偶校验完全不是一个等级。想要拿稳这三四级的分务必在答题时把“检错”和“纠错”分开写。5.3 复习时的三个实操提醒最后一个阶段我给备考者三条建议每一条都是往年考生用实际失分换来的教训。第一条把奇校验、偶校验、校验位前置、校验位后置四种组合各练一遍。只练一种很容易形成惯性思维考试一旦把校验位放在最高位你就可能按最低位的习惯写错顺序。第二条做完所有奇偶校验题后统一做一次“模式确认”。题目问“偶校验”你却在草稿纸上算成“奇校验”这种错误在考场上几乎无法自查出来因为你自己会默认算对了。唯一的办法是把题干里的校验方式圈出来每写一步都回头看一眼。第三条检查码字时把校验位一起数进去。我见过太多考卷前面的计算都对最后一个数字位数写错了错的根源就是统计整段码字时只数数据位。奇偶校验题不看复杂正因为简单才更要通过规范流程守住分数。从一道真题延伸到日常调试的固定动作我在帮人答疑和看卷时发现一个规律奇偶校验失分的考生大多数不是不知道规则而是没有形成固定的计算流程。真正的得分诀窍是在手边随时放一张“三步走”纸条先数数据位里的1再按奇偶模式填校验位最后把校验位放到规定位置拼成完整码字。接收端判错的时候永远把校验位算进去再统计。这个习惯不只对2025年6月这套真题有效你以后在串口调试、传感器数据校验、底层协议设计时同样用得上。每次发送一帧带奇偶校验位的数据我都会在纸上先写一遍校验位的计算过程哪怕整个过程只需要十秒钟。等这个动作变成肌肉记忆你会发现奇偶校验不再是需要思考的知识点而是看一眼就能给出答案的本能。