计算机系统概论——校验码

校验码

一、为什么需要校验码

计算机数据传输与存储过程中,可能出现:

  • 噪声干扰
  • 硬件故障
  • 信号衰减
    导致比特错误

检错(发现错误)
纠错(自动修正错误)


二、码距

⭐ 1. 码距定义

两个合法码字之间对应位不同的个数

例如

复制代码
10101
11100
不同位 = 3 → 码距 = 3

⭐ 2. 最小码距 d

所有合法码字之间最小的距离


三、码距与检错/纠错能力关系

⭐ 1. 检错能力

若要检查e位错误
d ≥ e + 1


⭐ 2. 纠错能力

若要纠正 t 位错误
d ≥ 2t + 1


⭐ 3. 同时检错 + 纠错

  • 纠正 t 位错
  • 检查 e 位错

d ≥ e + t + 1


四、奇偶校验码

⭐ 原理

利用奇偶性

保证码字中:1 的个数为奇数(奇校验),或偶数(偶校验)


⭐ 特点

检测 1 位错误

❌ 无法纠错

❌ 无法检测偶数位错误


⭐ 码距

d=2


五、海明码(Hamming Code)

⭐ 1. 基本思想

利用多个奇偶效验位,通过定位错误位置来纠错


⭐ 2. 海明码的能力

  • 纠正 1 位错误
  • 检测 2 位错误

⭐ 3. 海明码最小码距

海明码最小码距 d = 3


⭐ 4. 校验位数量公式

设:

  • 数据位 = n
  • 校验位 = k

必须满足:2k≥n+k+12^k ≥ n + k + 12k≥n+k+1


⭐ 5. 海明码校验位位置

校验位放在:2^i 位


⭐ 6. 海明码编码步骤

步骤:

① 确定校验位数量

② 插入校验位位置

③ 按奇偶规则计算校验位

④ 得到最终码字


📝 例题
题目:假设信息码(数据位)为 1011,采用偶校验(即每个校验组中"1"的个数为偶数),求其海明码。


🚀 详细解题步骤

① 确定校验位数量 (k)

  • 已知:信息位 n = 4
  • 公式:2k≥n+k+12^k ≥ n+k+12k≥n+k+1
  • 试算:
    • 若 k=1:21=2,4+1+1=62^1=2,4+1+1=621=2,4+1+1=6(不满足)
    • 若 k=2:22=4,4+2+1=72^2=4,4+2+1=722=4,4+2+1=7(不满足)
    • 若 k=3:23=8,4+3+1=82^3=8,4+3+1=823=8,4+3+1=8(满足 8≥8)
  • 结论:需要 3 个校验位(P1,P2,P3)
  • 总位数:4+3=7位

② 插入校验位位置

  • 规则:校验位Pi放在第 2i−12^{i-1}2i−1 的位置上(即第 1,2,4,8···位)。其余位置按顺序填入信息位
  • 位置分配表:
位置序号 7 6 5 4 3 2 1
类型 信息位 信息位 信息位 校验位 信息位 校验位 校验位
符号 D4D_4D4 D3D_3D3 D2D_2D2 P3P_3P3 D1D_1D1 P2P_2P2 P1P_1P1
数值 1 0 1 ? 1 ? ?

③ 按奇偶规则计算校验位

  • 规则核心:
    • P1P_1P1(位置1)复杂校验二进制末位是1的位置:1,3,5,7
    • P2P_2P2(位置2)复杂校验二进制倒数第二位是 1 的位置:2,3,6,7
    • P3P_3P3(位置4)复杂校验二进制倒数第三位是 1 的位置:4,5,6,7
    • (口诀:看位置序号的二进制表示,哪一位是1,就归哪个校验位管)
  • 开始计算(采用偶校验,即组内"1"的总数为偶数):
    1. 计算P1P_1P1(检查位置 1, 3, 5, 7):
      • 涉及数据:P1P_1P1,D1(1)D_1(1)D1(1),D2(1)D_2(1)D2(1),D4(1)D_4(1)D4(1)
      • 现在 1 的数量为 3 个(奇数)
      • 则P1P_1P1为1
    2. 计算P2P_2P2(检查位置 2, 3, 6, 7):
      • 涉及数据:P2P_2P2,D1(1)D_1(1)D1(1),D3(0)D_3(0)D3(0),D4(1)D_4(1)D4(1)
      • 现在 1 的数量为 2 个(偶数)
      • 则P2P_2P2为0
    3. 计算P3P_3P3(检查位置 4, 5, 6, 7):
      • 涉及数据:P3P_3P3,D2(1)D_2(1)D2(1),D3(0)D_3(0)D3(0),D4(1)D_4(1)D4(1)
      • 现在 1 的数量为 2 个(偶数)
      • 则P3P_3P3为0
  • 计算结果:P1=1,P2=0,P3=0P_1=1,P_2=0,P_3=0P1=1,P2=0,P3=0

④ 得到最终码字

位置序号 7 6 5 4 3 2 1
数值 1 0 1 0 1 0 1

最终海明码为:1010101


⭐ 7. 海明码纠错原理

计算校验结果 → 得到一个二进制数 → 错误位位置

直接翻转即可纠错


六、循环冗余校验码(CRC)

⭐ 1. 基本思想

利用模2除法生成校验码


⭐ 2. CRC工作过程

发送端

步骤:

1️⃣ 在数据后补0

2️⃣ 用生成多项式进行模2除法

3️⃣ 得到余数作为校验码

接收端

将收到的数据再次做模2除法:

  • 余数 = 0 :无错
  • 余数 ≠ 0 → 有错

📝 例题

  • 原始数据 (M):101110
  • 生成多项式 (G):x3+x+1x^3+x+1x3+x+1
    • 对应二进制除数:1011 (因为1∗x3+0∗x2+1∗x1+1∗x01*x^3+0*x^2+1*x^1+1*x^01∗x3+0∗x2+1∗x1+1∗x0)
  • 目标:求发送的完整帧(数据+校验码),并演示接收端验错。

🚀 第一部分:发送端计算

1️⃣ 在数据后补 0

  • 规则:补 0 的个数 = 生成多项式的最高次幂(或者说是除数位数 - 1)
  • 本题中,除数 1011 是 4 位,所以补 3 个 0
  • 被除数:101110 + 000 = 101110000

2️⃣ 模 2 除法

  • 加法/减法都等同于 异或 (XOR) 运算
  • 1⊕1=0,0⊕0=0,1⊕0=1,0⊕1=11⊕1=0,0⊕0=0,1⊕0=1,0⊕1=11⊕1=0,0⊕0=0,1⊕0=1,0⊕1=1
  • 不借位,不进位
  • 每次商只取 1 或 0(够除商1,不够除商0)

竖式计算过程:

复制代码
		1 0 1 1 1 0 0 0 0
按位 ⊕	1 0 1 1
-----------------------------------
		0 0 0 0 1 0 0 0 0
				1 0 1 1
------------------------------------
				0 0 1 1 0

余数为110

3️⃣ 得到最终码字

  • 原数据:101110
  • 校验码:110
  • 发送帧:101110110

🔍 第二部分:接收端验错

再次做模 2 除法

被除数:101110110

除数:1011

复制代码
1 0 1 1 1 0 1 1 0
1 0 1 1
------------------------
0 0 0 0 1 0 1 1 0
		1 0 1 1
		0 0 0 0 0
------------------------

余数 = 0 → 判定:无错,接收数据有效


⭐ 3. CRC特点

优点:

  • 检错能力极强
  • 可检测突发错误
  • 硬件实现简单

缺点:不能自动纠错


⭐ 4. CRC码距

一般 d ≥ 4

可检测:单错、双错、多位突发错


七、三种校验码对比

校验码 检错 纠错 码距
奇偶校验 1位 2
海明码 2位 1位 3
CRC 多位 ≥4

八、总结

⭐ 码距关系

复制代码
检错:d ≥ e + 1
纠错:d ≥ 2t + 1
同时:d ≥ e + t + 1

⭐ 海明码

复制代码
2^k ≥ n + k + 1
d = 3

⭐ CRC

复制代码
模2除法求余

复制代码
奇偶检1不能纠
海明纠1检2错
CRC突发检错强
码距决定纠检数
相关推荐
babe小鑫1 小时前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms2 小时前
ROS2知识大白话
笔记·学习·ros2
在这habit之下2 小时前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。2 小时前
2026.2.25监控学习
学习
im_AMBER2 小时前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J3 小时前
从“Hello World“ 开始 C++
c语言·c++·学习
匠心网络科技3 小时前
JavaScript进阶-ES6 带来的高效编程新体验
开发语言·前端·javascript·学习·面试
2501_918126914 小时前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
盐焗西兰花4 小时前
鸿蒙学习实战之路-STG系列(5/11)-守护策略管理-添加与修改策略
服务器·学习·harmonyos