第 141 篇
考研数电·零基础讲义 第01讲(下)|二进制运算与常用编码
考研数电·零基础讲义 · 第 01 讲(下)|二进制运算与常用编码 学完本讲,你能写出一个数的原码、反码、补码,会用补码做加减法并判断溢出;能认出并转换 8421BCD、2421、余 3 码、格雷码、奇偶校验码和 ASCII 码。预计用时:2–2.5 小时(含练习)。
本讲地图
- 学什么:二进制的加减乘除;负数在电路里怎么表示(原码、反码、补码);为什么"减法可以变成加补码";几种常用代码:BCD 码(8421、2421、余 3)、格雷码、奇偶校验码、ASCII 码。
- 华师怎么考:考纲"数制和码制"里的"码制"就是本讲。补码是加法器、比较器(第 11 讲)的基础;格雷码在卡诺图(第 04 讲)和计数器设计里反复出现;2026 回忆题第 6 题"设计 4 位奇校验器"直接用到本讲的奇偶校验概念。
- 教材对应:阎石第六版 第 1 章 1.4 节(二进制算术运算,反码、补码和补码运算)、1.5 节(几种常用的编码)。奇偶校验电路的设计在第 4 章组合逻辑里出现。
前置知识
- 会二进制和十进制、十六进制的互相转换,知道"位二进制最大是"(见第 01 讲(上))。
一、二进制的四则运算
大白话
二进制的加减乘除和十进制的竖式规则完全一样,唯一区别是"逢二进一、借一当二",而不是"逢十进一、借一当十"。
加法规则(必背)
| 算式 | 结果 | 说明 |
|---|---|---|
| 0 | ||
| 1 | ||
| 10 | 本位写 0,向高位进 1 | |
| 11 | 本位写 1,向高位进 1(两个加数都是 1,再加上低位来的进位 1) |
例题 1
计算和。
加法(从右往左逐位):
| 位 | ||||
|---|---|---|---|---|
| 被加数 | 1 | 0 | 0 | 1 |
| 加数 | 0 | 1 | 0 | 1 |
| 进位 | 1 | |||
| 和 | 1 | 1 | 1 | 0 |
最右一位,写 0 进 1;第二位;第三位;第四位。结果。验算: ✓。
减法:最右一位;第二位;第三位不够减,向第四位借 1(借来的 1 在本位当 2 用),;第四位被借走后剩 0,。结果。验算: ✓。
乘法和除法
二进制乘法其实就是"被乘数左移 + 相加":乘数某位是 1,就把被乘数左移相应位数加进来;是 0 就不加。除法是"右移 + 相减"。
这说明一件很重要的事:只要能把减法也变成加法,那么加减乘除就全部可以用"移位"和"加法"两种操作完成,电路就会简单很多。怎样把减法变成加法?这就是补码要解决的问题。
二、负数怎么表示:原码
大白话
电路里只有 0 和 1,没有"负号"这个符号。怎么办?在数的最前面专门留一位当"符号位":0 表示正,1 表示负。后面的位照常写绝对值。这种写法叫原码。
定义
原码 = 符号位 + 绝对值的二进制。符号位:0 为正,1 为负。
例如用 8 位(1 位符号 + 7 位数值):
- :,原码;
- :原码。
原码的麻烦
原码人看着直观,但电路算起来很麻烦:做减法时要先比较两个数绝对值谁大,用大的减小的,再决定结果的符号。这需要比较电路和加减法电路,结构复杂。另外原码里 0 有两种写法:,,也很别扭。
三、补码的原理:钟表上的"减法变加法"
大白话
你的手表停在 10 点,现在实际是 5 点,要拨回去。有两种拨法:
- 往回拨 5 格:;
- 往前拨 7 格:,表盘只有 12 个格,超过 12 的部分自动"转一圈消失",,同样到 5 点。
所以在表盘上,减 5 和加 7 效果一样。因为,正好是表盘转一圈的数(叫模)。我们说 7 是对模 12 的补码(补数)。
结论:在"超出部分自动丢掉"的条件下,减去一个数 = 加上它的补码。
换到二进制
4 位二进制一共 16 个码(0000–1111),超过 1111 再加 1 就会产生第 5 位的进位,如果电路只有 4 位,这个进位就"丢掉"了——这正好就是一个"模 16 的表盘"。
图 1:4 位二进制码排成一圈。从 1011 往前走 9 格(加 1001)到达 0100,和往回走 7 格(减 0111)结果相同(动画循环播放)。
所以可以改成:
最高位的 1 是溢出表盘的进位,扔掉,得。验算: ✓。这里(9)就是()对模 16 的补码,因为。
四、反码和补码的定义与求法
正式定义(教材口径)
对于带符号位的二进制数,设数值部分(不含符号位)有位:
逐行拆解
- 正数的原码、反码、补码三者完全相同,不用做任何变化。这一点最容易被忽略——不要对正数也去"取反加一"!
- "取反":1 变 0,0 变 1。
- 负数的补码 = 反码 + 1:这个"+1"加在最低位,可能会一路进位。
- 为什么这样求出来就是补码?对负数,数值部分取反得到的是(因为加上它的取反正好是个 1,即),再加 1 就是——正好是"凑满模的那个补数"。
例题 2
用 8 位(1 位符号 + 7 位数值)写出、、、的原码、反码、补码。
| 十进制 | 原码 | 反码 | 补码 |
|---|---|---|---|
| 00011010 | 00011010 | 00011010 | |
| 10011010 | 11100101 | 11100110 | |
| 00101101 | 00101101 | 00101101 | |
| 10101101 | 11010010 | 11010011 |
以为例一步步来:
- 绝对值 26 = (7 位数值);
- 原码:前面加符号位 1 → ;
- 反码:符号位 1 不动,后 7 位取反 → ,合起来;
- 补码:反码加 1 → 。
快捷法:从右往左找第一个 1
求负数补码时,可以对原码的数值部分这样做:从最右边往左找到第一个 1,这个 1 和它右边的 0 都不变,它左边的数值位全部取反,符号位保持 1。
拿试:数值部分,从右往左第一个 1 在倒数第二位,保留"10",左边的取反成,得,加上符号位:。和上面一样 ✓。
补码 → 原码(或十进制)
对补码再求一次补码就回到原码(符号位不动,数值位取反加 1)。
例:补码表示多少?符号位 1,是负数;数值位取反,加 1 得,所以是。
还有一个更快的看法:把补码最高位的权当成负的。8 位补码最高位权是:
4 位补码对照表(含符号位共 4 位)
| 十进制 | 原码 | 反码 | 补码 | 十进制 | 原码 | 反码 | 补码 |
|---|---|---|---|---|---|---|---|
| 0111 | 0111 | 0111 | 1001 | 1110 | 1111 | ||
| 0110 | 0110 | 0110 | 1010 | 1101 | 1110 | ||
| 0101 | 0101 | 0101 | 1011 | 1100 | 1101 | ||
| 0100 | 0100 | 0100 | 1100 | 1011 | 1100 | ||
| 0011 | 0011 | 0011 | 1101 | 1010 | 1011 | ||
| 0010 | 0010 | 0010 | 1110 | 1001 | 1010 | ||
| 0001 | 0001 | 0001 | 1111 | 1000 | 1001 | ||
| 0000 | 0000 | 0000 | — | — | 1000 |
注意最后一格:补码里 0 只有一种写法(0000),省下来的 1000 规定表示。所以 4 位补码的范围是,一般地,位(含符号位)补码范围是。8 位就是。
易错点 ⚠️
- 正数不变!只有负数才"取反加一"。
- 符号位不参与取反(教材口径)。
- 位数要先定好:同样是,4 位补码是 1011,8 位补码是 11111011(前面补的是 1,不是 0)。负数扩展位数时高位补符号位。
五、补码加减法与溢出
方法
- 选够位数,把两个数都写成补码(减法看成);
- 符号位和数值位一起按普通二进制加法相加;
- 最高位(符号位)产生的进位直接丢掉;
- 结果就是和的补码。如果结果符号位是 1,要换回原码才能读出数值。
例题 3
用 8 位补码计算、、、。
先写补码:,,,。
(1)
符号位 0,正数, ✓。
(2)
最高位进位丢掉,得 ✓。
(3)
符号位 1,是负数。数值位取反加 1 得,所以结果是 ✓。
(4)
丢掉进位得。符号位 1,数值位取反加 1:,结果 ✓。
你看,四种情况全部只用了加法,也不需要比较谁大谁小——这就是计算机里用补码的原因。
溢出:结果装不下
8 位补码最大只能表示。如果算会怎样?
结果符号位变成 1,读出来是——两个正数相加得了负数,显然错了。这叫溢出:真实结果超出了位数能表示的范围。
同理:,丢进位后是,两个负数加出了正数,也溢出了。
判断溢出的简单办法:
- 一正一负相加,永远不会溢出;
- 两个同号数相加,如果结果的符号和它们不同,就溢出了。
解决办法:增加位数。比如用 9 位或 16 位补码重新算。所以题目做补码运算前,要先估计结果大小,选够位数(教材例题里算时,因为绝对值之和 23 需要 5 位数值,就选了 1 位符号 + 5 位数值 = 6 位)。
易错点 ⚠️
- 进位丢掉,不是"加到结果里去"。
- 结果是补码:符号位为 1 时不能直接按二进制读数,要先转回原码。
- 同号相加前先估算是否超范围;超了就要加位数。
六、编码:数码不再表示"大小"
大白话
运动会上给运动员发号码牌,"035 号"并不表示这个人比"012 号"大,只是个代号。二进制码也一样:当一组 0/1 用来代表某个事物(一个十进制数字、一个字母、一个状态)时,它叫"代码",编码的规则叫码制。
前面讲的"数制"关心数值大小,"码制"只关心对应关系。
七、十进制代码(BCD 码)
为什么需要
人习惯十进制,机器习惯二进制。比如计算器、电子表,按键输入和数码管显示都是十进制,每一位十进制数字 0–9 需要单独用二进制代码表示。0–9 共 10 个状态,至少要 4 位二进制(3 位只有 8 种)。4 位有 16 种组合,挑哪 10 种、怎么对应,就形成了不同的 BCD 码(Binary Coded Decimal,二–十进制编码)。
常见 BCD 码对照表
| 十进制 | 8421 码 | 2421 码 | 余 3 码 |
|---|---|---|---|
| 0 | 0000 | 0000 | 0011 |
| 1 | 0001 | 0001 | 0100 |
| 2 | 0010 | 0010 | 0101 |
| 3 | 0011 | 0011 | 0110 |
| 4 | 0100 | 0100 | 0111 |
| 5 | 0101 | 1011 | 1000 |
| 6 | 0110 | 1100 | 1001 |
| 7 | 0111 | 1101 | 1010 |
| 8 | 1000 | 1110 | 1011 |
| 9 | 1001 | 1111 | 1100 |
| 权 | 8 4 2 1 | 2 4 2 1 | 无固定权 |
(教材表 1.5.1 还列了 5211 码和余 3 循环码,了解即可。)
1. 8421 码(最常用,常说的"BCD 码"一般就指它)
- 4 位从左到右的权是 8、4、2、1,和普通二进制一样,所以 0–9 的 8421 码就是它们的 4 位二进制。
- 1010–1111 这 6 个码不用(叫"伪码"或"禁用码")。
- 每位的权固定不变,叫有权码(恒权码)。
2. 2421 码
- 权是 2、4、2、1,也是有权码。例:,验证。
- 特点:0 和 9、1 和 8、2 和 7、3 和 6、4 和 5 的代码互为反码(逐位取反)。例如 2 = 0010,7 = 1101。这种性质叫"自补",做十进制减法(求 9 的补数)时很方便。
3. 余 3 码
- 规则:8421 码再加 3()。所以 0 是 0011,9 是 1100。
- 不是有权码。
- 也有自补性:0 和 9(0011 / 1100)、1 和 8 等互为反码。
- 两个余 3 码相加,和会比真实值的二进制多 6,于是十进制和为 10 时恰好等于二进制 16,能自动产生进位。了解即可。
例题 4:BCD 码和二进制数不是一回事
把十进制 93 分别写成二进制数和 8421BCD 码。
- 二进制数:,这是把整个数当作一个数值来转换。
- 8421BCD 码:一位十进制对应 4 位,9 → 1001,3 → 0011,所以。
两者完全不同!BCD 码是"逐位翻译",二进制是"整体换算"。
再练两个:
- (每一位都要写满 4 位,0 写成 0000);
- (5+3=8 → 1000,9+3=12 → 1100)。
反过来,逐组翻译:0111=7,1000=8,0101=5,即 785。:0100−0011=1,1010−0011=7,即 17。
易错点 ⚠️
- BCD 码 ≠ 二进制数。题目要 BCD 码,就 4 位一组逐位翻译;要二进制数,就整体除 2 取余。
- BCD 码每组必须写满 4 位,前导 0 不能省。
- 8421BCD 码里不会出现 1010–1111 这样的组。看到了要么是写错,要么题目说的是别的码。
八、格雷码(循环码)
大白话
想象一个旋转编码盘(比如音量旋钮)在两个位置之间转动。用普通二进制编码时,从 3(0011)转到 4(0100),三个位要同时变化。现实中几根线不可能完全同时变,哪怕差几纳秒,中间也可能短暂出现 0101、0111、0001 之类的错误码,下游电路可能误动作。
格雷码的设计思想就是:相邻的两个码只差一位。每次只变一位,就不会出现中间错码。
图 2:从 3 到 4,二进制要变 3 位,可能产生"过渡噪声";格雷码只变 1 位。
4 位格雷码表
| 序号 | 二进制 | 格雷码 | 序号 | 二进制 | 格雷码 |
|---|---|---|---|---|---|
| 0 | 0000 | 0000 | 8 | 1000 | 1100 |
| 1 | 0001 | 0001 | 9 | 1001 | 1101 |
| 2 | 0010 | 0011 | 10 | 1010 | 1111 |
| 3 | 0011 | 0010 | 11 | 1011 | 1110 |
| 4 | 0100 | 0110 | 12 | 1100 | 1010 |
| 5 | 0101 | 0111 | 13 | 1101 | 1011 |
| 6 | 0110 | 0101 | 14 | 1110 | 1001 |
| 7 | 0111 | 0100 | 15 | 1111 | 1000 |
观察规律:
- 任意上下相邻两行的格雷码只差一位;连最后一个 1000 和第一个 0000 也只差一位,首尾相接成环,所以叫循环码。
- 后 8 个是前 8 个"镜像"过来再把最高位改成 1(0100 ↔ 1100,0101 ↔ 1101……),所以也叫反射码。按这个办法,可以由位格雷码造出位格雷码。
- 格雷码没有固定的权,不能按权展开求值。
二进制 ↔ 格雷码的转换公式
这里用到一种运算"异或",记作:两位相同得 0,不同得 1(,,,)。异或会在第 02 讲(上)正式讲,这里先会用就行。
设二进制为,格雷码为:
二进制 → 格雷码:最高位照抄,其余每位 = 本位与左边一位异或。
格雷码 → 二进制:最高位照抄,其余每位 = 刚求出的左边那位二进制与本位格雷码异或。
例题 5
(1) 把二进制转成格雷码。
- ;
- ;
- ;
- 。
得格雷码(查表:序号 11 对应 1110 ✓)。
(2) 把格雷码转成二进制。
- ;
- ;
- ;
- 。
得二进制(即 9,查表:序号 9 的格雷码是 1101 ✓)。
易错点 ⚠️
- 格雷码 → 二进制时,异或的是二进制的上一位(刚算出来的),不是格雷码的上一位。这是最常见的错误。
- 格雷码不是有权码,不能"按权展开"。
九、奇偶校验码
大白话
数据在线路上传输时可能被干扰,某一位 0 变成 1 或 1 变成 0。怎么让接收方知道"可能出错了"?最简单的办法:发送方在数据后面多加一位"校验位",事先约定好"整串码里 1 的个数必须是奇数"(或偶数)。接收方数一数 1 的个数,不符合约定就说明出错了。
就像寄快递时在单子上写"共 5 件",收件人一数只有 4 件,就知道少了。
定义
奇偶校验码 = 信息位 + 1 位校验位。
- 奇校验:使整个码(信息位 + 校验位)中 1 的个数为奇数;
- 偶校验:使整个码中 1 的个数为偶数。
例题 6
信息位为(7 位),分别求奇校验位和偶校验位。
数 1 的个数:1, 0, 1, 1, 0, 1, 0 → 共 4 个(偶数)。
- 奇校验:要凑成奇数,校验位取 1,整码,共 5 个 1;
- 偶校验:已经是偶数,校验位取 0,整码。
再看 4 位信息:有 3 个 1(奇数),奇校验位取 0,偶校验位取 1。
图 3:奇校验传输示意。发送 1101 配校验位 0;途中一位被干扰翻转,接收端数出偶数个 1,判定出错(动画循环播放)。
检错能力
- 能发现1 位错误(更一般地,奇数个位同时出错都能发现);
- 2 位同时出错就发现不了(1 的个数奇偶性没变);
- 只能"检错",不能纠错——它只知道错了,不知道错在哪一位。
它的优点是简单:只多一位,电路也只需要几个异或门。
用异或门产生校验位(2026 真题的伏笔)
异或有个妙用:多个位连续异或,结果为 1 当且仅当其中 1 的个数为奇数。比如(3 个 1,奇数)。
所以对 4 位数据:
- 偶校验位(数据有奇数个 1 时补 1,凑成偶数);
- 奇校验位(就是上式取反)。
2026 回忆题第 6 题:"设计 4 位奇校验器:4 位中有奇数个 1 输出 1,否则输出 0,用异或门实现。" 注意题目自己定义了输出:奇数个 1 输出 1——这正好就是上面那个 4 位连续异或。怎样画真值表、写表达式、画出用异或门搭的电路,在学完异或门(第 02 讲(上))和组合电路设计(第 08 讲)后会完整地做一遍。现在你只要记住:"数 1 的个数是奇是偶"这类问题,第一反应就是异或。
易错点 ⚠️
- 奇校验是让"包括校验位在内"的 1 的总数为奇数,不是让信息位的 1 为奇数。
- "奇校验位"和"检测到奇数个 1 输出 1"是两回事:前者是让整体凑成奇数的那一位,后者是一个检测电路的输出。做题时以题目的文字定义为准。
十、ASCII 码
是什么
ASCII(美国信息交换标准代码)用 7 位二进制()表示 128 个字符:数字 0–9、大小写英文字母、标点符号和一些控制字符(如回车、换行)。计算机键盘上每个键基本都有对应的 ASCII 码。
几个要记住的"锚点"
| 字符 | 7 位二进制 | 十六进制 | 规律 |
|---|---|---|---|
| '0' | 011 0000 | 30H | 数字 0–9 是 30H–39H |
| 'A' | 100 0001 | 41H | 大写 A–Z 是 41H–5AH |
| 'a' | 110 0001 | 61H | 小写 a–z 是 61H–7AH |
| 空格 | 010 0000 | 20H |
记住这几个就能推出其他:比如 '7' = 30H + 7 = 37H = 011 0111;'M' 是第 13 个字母,41H + 12 = 4DH = 100 1101。大小写之间正好差 20H(只差这一位)。
例题 7
写出字符串 "Hi!" 的 ASCII 码。
- 'H' = 48H = 100 1000;
- 'i' = 69H = 110 1001;
- '!' = 21H = 010 0001。
所以 "Hi!" = 1001000 1101001 0100001。
实际传输时,常在 7 位 ASCII 码前面再加 1 位奇偶校验位凑成 8 位(一个字节),这就把上一节的校验码用上了。
速记卡
| 项目 | 要点 |
|---|---|
| 二进制加法 | , |
| 原码 | 符号位(0 正 1 负)+ 绝对值 |
| 反码 | 正数同原码;负数符号位不变、数值位取反 |
| 补码 | 正数同原码;负数 = 反码 + 1;快捷法:从右找第一个 1,其左数值位取反 |
| 补码 → 真值 | 再求一次补码;或最高位权取负(8 位为) |
| 补码范围 | 位:(4 位,8 位) |
| 补码加减 | 符号位一起加,最高位进位丢掉;减法 = 加负数的补码 |
| 溢出 | 同号相加结果变号即溢出;异号相加不溢出 |
| 8421BCD | 每位十进制换 4 位二进制,1010–1111 不用;≠ 二进制数 |
| 2421 / 余 3 | 2421 有权、自补;余 3 = 8421 + 0011,自补、无权 |
| 格雷码 | 相邻只差一位;; |
| 奇偶校验 | 整码 1 的个数为奇(奇校验)/偶(偶校验);能检单错,不能纠错 |
| 异或检奇偶 | ⇔ 奇数个 1(2026 真题第 6 题) |
| ASCII | 7 位;'0'=30H,'A'=41H,'a'=61H |
自测练习
1. 用 8 位(含符号位)写出的原码、反码和补码。
答案与提示
(7 位)。原码;反码(符号位不变,数值位取反);补码(反码加 1)。
2. 8 位补码表示的十进制数是多少?
答案与提示
符号位 1,负数。方法一:数值位取反,加 1 得,所以是。
方法二:。
3. 用 8 位补码计算,写出过程。
答案与提示
,。
,无进位。
符号位 1,数值位取反加 1 得,结果 ✓。
4. 用 8 位补码计算,结果正确吗?为什么?
答案与提示
,。相加得,丢进位后为。
两个负数相加得正数,溢出了。因为真实结果小于 8 位补码的下限。需要用 9 位或更多位重新计算。
5. 把十进制数 409 分别写成 8421BCD 码和余 3 码。
答案与提示
8421BCD:。
余 3 码:每位加 3,4+3=7 → 0111,0+3=3 → 0011,9+3=12 → 1100,即。
6. (1) 把二进制转为格雷码;(2) 把格雷码转为二进制。
答案与提示
(1) ,,,,得(表中序号 7 ✓)。
(2) ,,,,得(即 10,表中序号 10 的格雷码是 1111 ✓)。
7. 信息位为,求奇校验位;若接收端收到(最后一位为校验位),按奇校验判断是否出错。
答案与提示
有 2 个 1(偶数),奇校验位取 1,发送。
收到:1 的个数为 4(偶数),不满足奇校验,判定出错(实际是第 3 位被翻转了,但校验码本身指不出是哪一位)。
8.(华师风格)某电路输入 4 位二进制数,当其中有奇数个 1 时输出,否则。(1) 输入、时各为多少?(2) 用异或运算写出的表达式。
答案与提示
(1) 有 3 个 1,;有 2 个 1,。
(2) 。验证: ✓, ✓。
这就是 2026 回忆题第 6 题的核心表达式,完整的设计步骤(真值表 → 表达式 → 用 3 个两输入异或门级联实现)见第 08 讲。
下一讲预告
第 02 讲(上):进入逻辑代数——与、或、非三种基本运算,以及与非、或非、与或非、异或、同或这些复合逻辑,配逻辑门符号对照图。
👉 点击进入下一讲:第02讲(上)|逻辑代数的三种基本运算与复合逻辑
评论
还没有评论。 来写第一条。