第 141 篇

考研数电·零基础讲义 第01讲(下)|二进制运算与常用编码

约 20 分钟 6737 字 华南师范大学数字电子技术考研数电零基础讲义

考研数电·零基础讲义 · 第 01 讲(下)|二进制运算与常用编码 学完本讲,你能写出一个数的原码、反码、补码,会用补码做加减法并判断溢出;能认出并转换 8421BCD、2421、余 3 码、格雷码、奇偶校验码和 ASCII 码。预计用时:2–2.5 小时(含练习)。

本讲地图

  • 学什么:二进制的加减乘除;负数在电路里怎么表示(原码、反码、补码);为什么"减法可以变成加补码";几种常用代码:BCD 码(8421、2421、余 3)、格雷码、奇偶校验码、ASCII 码。
  • 华师怎么考:考纲"数制和码制"里的"码制"就是本讲。补码是加法器、比较器(第 11 讲)的基础;格雷码在卡诺图(第 04 讲)和计数器设计里反复出现;2026 回忆题第 6 题"设计 4 位奇校验器"直接用到本讲的奇偶校验概念。
  • 教材对应:阎石第六版 第 1 章 1.4 节(二进制算术运算,反码、补码和补码运算)、1.5 节(几种常用的编码)。奇偶校验电路的设计在第 4 章组合逻辑里出现。

前置知识

  • 会二进制和十进制、十六进制的互相转换,知道"nn位二进制最大是2n−12^n-1"(见第 01 讲(上))。

一、二进制的四则运算

大白话

二进制的加减乘除和十进制的竖式规则完全一样,唯一区别是"逢二进一、借一当二",而不是"逢十进一、借一当十"。

加法规则(必背)

算式 结果 说明
0+00+0 0
0+10+1 1
1+11+1 10 本位写 0,向高位进 1
1+1+11+1+1 11 本位写 1,向高位进 1(两个加数都是 1,再加上低位来的进位 1)

例题 1

计算1001+01011001+0101和1001−01011001-0101⁠。

加法(从右往左逐位):

位 232^3 222^2 212^1 202^0
被加数 1 0 0 1
加数 0 1 0 1
进位 1
和 1 1 1 0

最右一位1+1=101+1=10⁠,写 0 进 1;第二位0+0+1=10+0+1=1⁠;第三位0+1=10+1=1⁠;第四位1+0=11+0=1⁠。结果11101110⁠。验算:9+5=14=(1110)29+5=14=(1110)_2 ✓。

减法:最右一位1−1=01-1=0⁠;第二位0−0=00-0=0⁠;第三位0−10-1不够减,向第四位借 1(借来的 1 在本位当 2 用),2−1=12-1=1⁠;第四位被借走后剩 0,0−0=00-0=0⁠。结果01000100⁠。验算:9−5=49-5=4 ✓。

乘法和除法

二进制乘法其实就是"被乘数左移 + 相加":乘数某位是 1,就把被乘数左移相应位数加进来;是 0 就不加。除法是"右移 + 相减"。

这说明一件很重要的事:只要能把减法也变成加法,那么加减乘除就全部可以用"移位"和"加法"两种操作完成,电路就会简单很多。怎样把减法变成加法?这就是补码要解决的问题。


二、负数怎么表示:原码

大白话

电路里只有 0 和 1,没有"负号"这个符号。怎么办?在数的最前面专门留一位当"符号位":0 表示正,1 表示负。后面的位照常写绝对值。这种写法叫原码。

定义

原码 = 符号位 + 绝对值的二进制。符号位:0 为正,1 为负。

例如用 8 位(1 位符号 + 7 位数值):

  • +26+26⁠:26=(0011010)226=(0011010)_2⁠,原码00011010\mathbf{0}0011010⁠;
  • −26-26⁠:原码10011010\mathbf{1}0011010⁠。

原码的麻烦

原码人看着直观,但电路算起来很麻烦:做减法时要先比较两个数绝对值谁大,用大的减小的,再决定结果的符号。这需要比较电路和加减法电路,结构复杂。另外原码里 0 有两种写法:+0=00000000+0=00000000⁠,−0=10000000-0=10000000⁠,也很别扭。


三、补码的原理:钟表上的"减法变加法"

大白话

你的手表停在 10 点,现在实际是 5 点,要拨回去。有两种拨法:

  • 往回拨 5 格:10−5=510-5=5⁠;
  • 往前拨 7 格:10+7=1710+7=17⁠,表盘只有 12 个格,超过 12 的部分自动"转一圈消失",17−12=517-12=5⁠,同样到 5 点。

所以在表盘上,减 5 和加 7 效果一样。因为5+7=125+7=12⁠,正好是表盘转一圈的数(叫模)。我们说 7 是−5-5对模 12 的补码(补数)。

结论:在"超出部分自动丢掉"的条件下,减去一个数 = 加上它的补码。

换到二进制

4 位二进制一共 16 个码(0000–1111),超过 1111 再加 1 就会产生第 5 位的进位,如果电路只有 4 位,这个进位就"丢掉"了——这正好就是一个"模 16 的表盘"。

4位二进制的16个码排成一圈,像表盘:从1011往前走9格(加1001)到达0100,等于往回走7格,说明减7可以用加9代替(动画循环播放) 0000 0 0001 +1 0010 +2 0011 +3 0100 +4 0101 +5 0110 +6 0111 +7 1000 -8 1001 -7 1010 -6 1011 -5 1100 -4 1101 -3 1110 -2 1111 -1 外圈:4位二进制码 内圈:把它当补码时的值 蓝色为正数,红色为负数 1011 − 0111 = 0100 改成:1011 + 1001 = 1 0100 最高位的进位"溢出"表盘,扔掉 模 16:7 + 9 = 16 所以 9(1001)是 −7 的补码 就像表盘模 12: 往回拨 5 格 = 往前拨 7 格

图 1:4 位二进制码排成一圈。从 1011 往前走 9 格(加 1001)到达 0100,和往回走 7 格(减 0111)结果相同(动画循环播放)。

所以1011−01111011-0111可以改成1011+10011011+1001⁠:

1011+1001=1 01001011+1001=1\,0100

最高位的 1 是溢出表盘的进位,扔掉,得01000100⁠。验算:11−7=411-7=4 ✓。这里10011001(9)就是−0111-0111(⁠−7-7⁠)对模 16 的补码,因为7+9=167+9=16⁠。


四、反码和补码的定义与求法

正式定义(教材口径)

对于带符号位的二进制数,设数值部分(不含符号位)有nn位:

反码={原码正数符号位不变,数值位逐位取反负数\text{反码}=\begin{cases}\text{原码} & \text{正数}\\ \text{符号位不变,数值位逐位取反} & \text{负数}\end{cases} 补码={原码正数反码+1负数\text{补码}=\begin{cases}\text{原码} & \text{正数}\\ \text{反码}+1 & \text{负数}\end{cases}

逐行拆解

  • 正数的原码、反码、补码三者完全相同,不用做任何变化。这一点最容易被忽略——不要对正数也去"取反加一"!
  • "取反":1 变 0,0 变 1。
  • 负数的补码 = 反码 + 1:这个"+1"加在最低位,可能会一路进位。
  • 为什么这样求出来就是补码?对负数−N-N⁠,数值部分取反得到的是(2n−1)−N(2^n-1)-N(因为NN加上它的取反正好是nn个 1,即2n−12^n-1⁠),再加 1 就是2n−N2^n-N——正好是"凑满模的那个补数"。

例题 2

用 8 位(1 位符号 + 7 位数值)写出+26+26⁠、−26-26⁠、+45+45⁠、−45-45的原码、反码、补码。

十进制 原码 反码 补码
+26+26 00011010 00011010 00011010
−26-26 10011010 11100101 11100110
+45+45 00101101 00101101 00101101
−45-45 10101101 11010010 11010011

以−26-26为例一步步来:

  1. 绝对值 26 = 00110100011010(7 位数值);
  2. 原码:前面加符号位 1 → 1001101010011010⁠;
  3. 反码:符号位 1 不动,后 7 位00110100011010取反 → 11001011100101⁠,合起来1110010111100101⁠;
  4. 补码:反码加 1 → 11100101+1=1110011011100101+1=11100110⁠。

快捷法:从右往左找第一个 1

求负数补码时,可以对原码的数值部分这样做:从最右边往左找到第一个 1,这个 1 和它右边的 0 都不变,它左边的数值位全部取反,符号位保持 1。

拿−26-26试:数值部分00110100011010⁠,从右往左第一个 1 在倒数第二位,保留"10",左边的0011000110取反成1100111001⁠,得11001101100110⁠,加上符号位:1110011011100110⁠。和上面一样 ✓。

补码 → 原码(或十进制)

对补码再求一次补码就回到原码(符号位不动,数值位取反加 1)。

例:补码1111011011110110表示多少?符号位 1,是负数;数值位11101101110110取反00010010001001⁠,加 1 得0001010=100001010=10⁠,所以是−10-10⁠。

还有一个更快的看法:把补码最高位的权当成负的。8 位补码最高位权是−27=−128-2^7=-128⁠:

11110110→−128+64+32+16+4+2=−1011110110\to-128+64+32+16+4+2=-10

4 位补码对照表(含符号位共 4 位)

十进制 原码 反码 补码 十进制 原码 反码 补码
+7+7 0111 0111 0111 −1-1 1001 1110 1111
+6+6 0110 0110 0110 −2-2 1010 1101 1110
+5+5 0101 0101 0101 −3-3 1011 1100 1101
+4+4 0100 0100 0100 −4-4 1100 1011 1100
+3+3 0011 0011 0011 −5-5 1101 1010 1011
+2+2 0010 0010 0010 −6-6 1110 1001 1010
+1+1 0001 0001 0001 −7-7 1111 1000 1001
+0+0 0000 0000 0000 −8-8 — — 1000

注意最后一格:补码里 0 只有一种写法(0000),省下来的 1000 规定表示−8-8⁠。所以 4 位补码的范围是−8∼+7-8\sim+7,一般地,nn位(含符号位)补码范围是−2n−1∼2n−1−1-2^{n-1}\sim2^{n-1}-1⁠。8 位就是−128∼+127-128\sim+127⁠。

易错点 ⚠️

  • 正数不变!只有负数才"取反加一"。
  • 符号位不参与取反(教材口径)。
  • 位数要先定好:同样是−5-5⁠,4 位补码是 1011,8 位补码是 11111011(前面补的是 1,不是 0)。负数扩展位数时高位补符号位。

五、补码加减法与溢出

方法

  1. 选够位数,把两个数都写成补码(减法A−BA-B看成A+(−B)A+(-B)⁠);
  2. 符号位和数值位一起按普通二进制加法相加;
  3. 最高位(符号位)产生的进位直接丢掉;
  4. 结果就是和的补码。如果结果符号位是 1,要换回原码才能读出数值。

例题 3

用 8 位补码计算25+1825+18⁠、25−1825-18⁠、−25+18-25+18⁠、−25−18-25-18⁠。

先写补码:+25=00011001+25=00011001⁠,−25=11100111-25=11100111⁠,+18=00010010+18=00010010⁠,−18=11101110-18=11101110⁠。

(1) 25+1825+18

00011001+00010010=0010101100011001+00010010=00101011

符号位 0,正数,32+8+2+1=4332+8+2+1=43 ✓。

(2) 25−18=25+(−18)25-18=25+(-18)

00011001+11101110=1 0000011100011001+11101110=\mathbf{1}\,00000111

最高位进位丢掉,得00000111=+700000111=+7 ✓。

(3) −25+18-25+18

11100111+00010010=1111100111100111+00010010=11111001

符号位 1,是负数。数值位11110011111001取反加 1 得0000111=70000111=7⁠,所以结果是−7-7 ✓。

(4) −25−18=(−25)+(−18)-25-18=(-25)+(-18)

11100111+11101110=1 1101010111100111+11101110=\mathbf{1}\,11010101

丢掉进位得1101010111010101⁠。符号位 1,数值位取反加 1:0101010+1=0101011=430101010+1=0101011=43⁠,结果−43-43 ✓。

你看,四种情况全部只用了加法,也不需要比较谁大谁小——这就是计算机里用补码的原因。

溢出:结果装不下

8 位补码最大只能表示+127+127⁠。如果算100+50=150100+50=150会怎样?

01100100+00110010=1001011001100100+00110010=10010110

结果符号位变成 1,读出来是−106-106——两个正数相加得了负数,显然错了。这叫溢出:真实结果超出了位数能表示的范围。

同理(−100)+(−50)(-100)+(-50)⁠:10011100+11001110=1 0110101010011100+11001110=\mathbf{1}\,01101010⁠,丢进位后是+106+106⁠,两个负数加出了正数,也溢出了。

判断溢出的简单办法:

  • 一正一负相加,永远不会溢出;
  • 两个同号数相加,如果结果的符号和它们不同,就溢出了。

解决办法:增加位数。比如用 9 位或 16 位补码重新算。所以题目做补码运算前,要先估计结果大小,选够位数(教材例题里算±13±10\pm13\pm10时,因为绝对值之和 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,也是有权码。例:7=(1101)24217=(1101)_{2421}⁠,验证2+4+0+1=72+4+0+1=7⁠。
  • 特点:0 和 9、1 和 8、2 和 7、3 和 6、4 和 5 的代码互为反码(逐位取反)。例如 2 = 0010,7 = 1101。这种性质叫"自补",做十进制减法(求 9 的补数)时很方便。

3. 余 3 码

  • 规则:8421 码再加 3(⁠00110011⁠)。所以 0 是 0011,9 是 1100。
  • 不是有权码。
  • 也有自补性:0 和 9(0011 / 1100)、1 和 8 等互为反码。
  • 两个余 3 码相加,和会比真实值的二进制多 6,于是十进制和为 10 时恰好等于二进制 16,能自动产生进位。了解即可。

例题 4:BCD 码和二进制数不是一回事

把十进制 93 分别写成二进制数和 8421BCD 码。

  • 二进制数:93=64+16+8+4+1=(1011101)293=64+16+8+4+1=(1011101)_2⁠,这是把整个数当作一个数值来转换。
  • 8421BCD 码:一位十进制对应 4 位,9 → 1001,3 → 0011,所以93=(1001 0011)8421BCD93=(1001\ 0011)_{8421BCD}⁠。

两者完全不同!BCD 码是"逐位翻译",二进制是"整体换算"。

再练两个:

  • 2026=(0010 0000 0010 0110)8421BCD2026=(0010\ 0000\ 0010\ 0110)_{8421BCD}(每一位都要写满 4 位,0 写成 0000);
  • 59=(1000 1100)余3码59=(1000\ 1100)_{\text{余3码}}(5+3=8 → 1000,9+3=12 → 1100)。

反过来,(0111 1000 0101)8421BCD(0111\ 1000\ 0101)_{8421BCD}逐组翻译:0111=7,1000=8,0101=5,即 785。(0100 1010)余3码(0100\ 1010)_{\text{余3码}}⁠:0100−0011=1,1010−0011=7,即 17。

易错点 ⚠️

  • BCD 码 ≠ 二进制数。题目要 BCD 码,就 4 位一组逐位翻译;要二进制数,就整体除 2 取余。
  • BCD 码每组必须写满 4 位,前导 0 不能省。
  • 8421BCD 码里不会出现 1010–1111 这样的组。看到了要么是写错,要么题目说的是别的码。

八、格雷码(循环码)

大白话

想象一个旋转编码盘(比如音量旋钮)在两个位置之间转动。用普通二进制编码时,从 3(0011)转到 4(0100),三个位要同时变化。现实中几根线不可能完全同时变,哪怕差几纳秒,中间也可能短暂出现 0101、0111、0001 之类的错误码,下游电路可能误动作。

格雷码的设计思想就是:相邻的两个码只差一位。每次只变一位,就不会出现中间错码。

从3变到4:二进制0011到0100要同时变3位,若变化不同步会短暂出现0101等错误码;格雷码0010到0110只变1位 二进制 3 0 0 1 1 → 4 0 1 0 0 变 3 位 若最低位变得慢,瞬间会出现 0101(=5),这是"过渡噪声" 格雷码 3 0 0 1 0 → 4 0 1 1 0 只变 1 位 任何相邻两个码只差一位,不会出现中间错码 3位格雷码顺序:000 → 001 → 011 → 010 → 110 → 111 → 101 → 100 →(回到000) 最后一个和第一个也只差一位,所以又叫"循环码"

图 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……),所以也叫反射码。按这个办法,可以由nn位格雷码造出n+1n+1位格雷码。
  • 格雷码没有固定的权,不能按权展开求值。

二进制 ↔ 格雷码的转换公式

这里用到一种运算"异或",记作⊕\oplus⁠:两位相同得 0,不同得 1(⁠0⊕0=00\oplus0=0⁠,0⊕1=10\oplus1=1⁠,1⊕0=11\oplus0=1⁠,1⊕1=01\oplus1=0⁠)。异或会在第 02 讲(上)正式讲,这里先会用就行。

设二进制为B3B2B1B0B_3B_2B_1B_0⁠,格雷码为G3G2G1G0G_3G_2G_1G_0⁠:

二进制 → 格雷码:最高位照抄,其余每位 = 本位与左边一位异或。

G3=B3,Gi=Bi+1⊕Bi (i=2,1,0)G_3=B_3,\quad G_i=B_{i+1}\oplus B_i\ (i=2,1,0)

格雷码 → 二进制:最高位照抄,其余每位 = 刚求出的左边那位二进制与本位格雷码异或。

B3=G3,Bi=Bi+1⊕Gi (i=2,1,0)B_3=G_3,\quad B_i=B_{i+1}\oplus G_i\ (i=2,1,0)

例题 5

(1) 把二进制10111011转成格雷码。

  • G3=B3=1G_3=B_3=1⁠;
  • G2=B3⊕B2=1⊕0=1G_2=B_3\oplus B_2=1\oplus0=1⁠;
  • G1=B2⊕B1=0⊕1=1G_1=B_2\oplus B_1=0\oplus1=1⁠;
  • G0=B1⊕B0=1⊕1=0G_0=B_1\oplus B_0=1\oplus1=0⁠。

得格雷码11101110(查表:序号 11 对应 1110 ✓)。

(2) 把格雷码11011101转成二进制。

  • B3=G3=1B_3=G_3=1⁠;
  • B2=B3⊕G2=1⊕1=0B_2=B_3\oplus G_2=1\oplus1=0⁠;
  • B1=B2⊕G1=0⊕0=0B_1=B_2\oplus G_1=0\oplus0=0⁠;
  • B0=B1⊕G0=0⊕1=1B_0=B_1\oplus G_0=0\oplus1=1⁠。

得二进制10011001(即 9,查表:序号 9 的格雷码是 1101 ✓)。

易错点 ⚠️

  • 格雷码 → 二进制时,异或的是二进制的上一位(刚算出来的Bi+1B_{i+1}⁠),不是格雷码的上一位。这是最常见的错误。
  • 格雷码不是有权码,不能"按权展开"。

九、奇偶校验码

大白话

数据在线路上传输时可能被干扰,某一位 0 变成 1 或 1 变成 0。怎么让接收方知道"可能出错了"?最简单的办法:发送方在数据后面多加一位"校验位",事先约定好"整串码里 1 的个数必须是奇数"(或偶数)。接收方数一数 1 的个数,不符合约定就说明出错了。

就像寄快递时在单子上写"共 5 件",收件人一数只有 4 件,就知道少了。

定义

奇偶校验码 = 信息位 + 1 位校验位。

  • 奇校验:使整个码(信息位 + 校验位)中 1 的个数为奇数;
  • 偶校验:使整个码中 1 的个数为偶数。

例题 6

信息位为10110101011010(7 位),分别求奇校验位和偶校验位。

数 1 的个数:1, 0, 1, 1, 0, 1, 0 → 共 4 个(偶数)。

  • 奇校验:要凑成奇数,校验位取 1,整码1011010 11011010\,\mathbf{1}⁠,共 5 个 1;
  • 偶校验:已经是偶数,校验位取 0,整码1011010 01011010\,\mathbf{0}⁠。

再看 4 位信息11011101⁠:有 3 个 1(奇数),奇校验位取 0,偶校验位取 1。

奇校验示意:发送数据1101,配校验位0使1的总数为奇数;传输中一位出错后接收端数出偶数个1,判定出错(动画循环播放) 发送端 1 1 0 1 0 数据 1101 有 3 个 1 奇校验位取 0 → 总数 3(奇) 传输线路(有干扰) 第 2 位被干扰翻转 接收端 1 1 0 1 0 0 收到 10010:只有 2 个 1(偶数) → 违反奇校验,判定出错! 奇校验:信息位 + 校验位中 1 的总个数为奇数;偶校验:总个数为偶数 能发现 1 位(或奇数位)错误;2 位同时错就发现不了,也不知道错在哪一位 校验位可用异或门算出:偶校验位 = 数据各位异或,奇校验位 = 它取反

图 3:奇校验传输示意。发送 1101 配校验位 0;途中一位被干扰翻转,接收端数出偶数个 1,判定出错(动画循环播放)。

检错能力

  • 能发现1 位错误(更一般地,奇数个位同时出错都能发现);
  • 2 位同时出错就发现不了(1 的个数奇偶性没变);
  • 只能"检错",不能纠错——它只知道错了,不知道错在哪一位。

它的优点是简单:只多一位,电路也只需要几个异或门。

用异或门产生校验位(2026 真题的伏笔)

异或有个妙用:多个位连续异或,结果为 1 当且仅当其中 1 的个数为奇数。比如1⊕1⊕0⊕1=11\oplus1\oplus0\oplus1=1(3 个 1,奇数)。

所以对 4 位数据b3b2b1b0b_3b_2b_1b_0⁠:

b3⊕b2⊕b1⊕b0={1有奇数个 10有偶数个 1b_3\oplus b_2\oplus b_1\oplus b_0=\begin{cases}1 & \text{有奇数个 }1\\ 0 & \text{有偶数个 }1\end{cases}
  • 偶校验位P偶=b3⊕b2⊕b1⊕b0P_{\text{偶}}=b_3\oplus b_2\oplus b_1\oplus b_0(数据有奇数个 1 时补 1,凑成偶数);
  • 奇校验位P奇=b3⊕b2⊕b1⊕b0‾P_{\text{奇}}=\overline{b_3\oplus b_2\oplus b_1\oplus b_0}(就是上式取反)。

2026 回忆题第 6 题:"设计 4 位奇校验器:4 位中有奇数个 1 输出 1,否则输出 0,用异或门实现。" 注意题目自己定义了输出:奇数个 1 输出 1——这正好就是上面那个 4 位连续异或。怎样画真值表、写表达式、画出用异或门搭的电路,在学完异或门(第 02 讲(上))和组合电路设计(第 08 讲)后会完整地做一遍。现在你只要记住:"数 1 的个数是奇是偶"这类问题,第一反应就是异或。

易错点 ⚠️

  • 奇校验是让"包括校验位在内"的 1 的总数为奇数,不是让信息位的 1 为奇数。
  • "奇校验位"和"检测到奇数个 1 输出 1"是两回事:前者是让整体凑成奇数的那一位,后者是一个检测电路的输出。做题时以题目的文字定义为准。

十、ASCII 码

是什么

ASCII(美国信息交换标准代码)用 7 位二进制(⁠b7b6b5b4b3b2b1b_7b_6b_5b_4b_3b_2b_1⁠)表示 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(只差b6b_6这一位)。

例题 7

写出字符串 "Hi!" 的 ASCII 码。

  • 'H' = 48H = 100 1000;
  • 'i' = 69H = 110 1001;
  • '!' = 21H = 010 0001。

所以 "Hi!" = 1001000 1101001 0100001。

实际传输时,常在 7 位 ASCII 码前面再加 1 位奇偶校验位凑成 8 位(一个字节),这就把上一节的校验码用上了。


速记卡

项目 要点
二进制加法 1+1=101+1=10⁠,1+1+1=111+1+1=11
原码 符号位(0 正 1 负)+ 绝对值
反码 正数同原码;负数符号位不变、数值位取反
补码 正数同原码;负数 = 反码 + 1;快捷法:从右找第一个 1,其左数值位取反
补码 → 真值 再求一次补码;或最高位权取负(8 位为−128-128⁠)
补码范围 nn位:−2n−1∼2n−1−1-2^{n-1}\sim2^{n-1}-1(4 位−8∼7-8\sim7⁠,8 位−128∼127-128\sim127⁠)
补码加减 符号位一起加,最高位进位丢掉;减法 = 加负数的补码
溢出 同号相加结果变号即溢出;异号相加不溢出
8421BCD 每位十进制换 4 位二进制,1010–1111 不用;≠ 二进制数
2421 / 余 3 2421 有权、自补;余 3 = 8421 + 0011,自补、无权
格雷码 相邻只差一位;Gi=Bi+1⊕BiG_i=B_{i+1}\oplus B_i⁠;Bi=Bi+1⊕GiB_i=B_{i+1}\oplus G_i
奇偶校验 整码 1 的个数为奇(奇校验)/偶(偶校验);能检单错,不能纠错
异或检奇偶 b3⊕b2⊕b1⊕b0=1b_3\oplus b_2\oplus b_1\oplus b_0=1 ⇔ 奇数个 1(2026 真题第 6 题)
ASCII 7 位;'0'=30H,'A'=41H,'a'=61H

自测练习

1. 用 8 位(含符号位)写出−37-37的原码、反码和补码。

答案与提示

37=010010137=0100101(7 位)。原码1010010110100101⁠;反码1101101011011010(符号位不变,数值位取反);补码1101101111011011(反码加 1)。

2. 8 位补码1110110011101100表示的十进制数是多少?

答案与提示

符号位 1,负数。方法一:数值位11011001101100取反00100110010011⁠,加 1 得0010100=200010100=20⁠,所以是−20-20⁠。

方法二:−128+64+32+8+4=−20-128+64+32+8+4=-20⁠。

3. 用 8 位补码计算19−2719-27⁠,写出过程。

答案与提示

+19=00010011+19=00010011⁠,−27=11100101-27=11100101⁠。

00010011+11100101=1111100000010011+11100101=11111000⁠,无进位。

符号位 1,数值位11110001111000取反加 1 得0001000=80001000=8⁠,结果−8-8 ✓。

4. 用 8 位补码计算(−64)+(−70)(-64)+(-70)⁠,结果正确吗?为什么?

答案与提示

−64=11000000-64=11000000⁠,−70=10111010-70=10111010⁠。相加得1 01111010\mathbf{1}\,01111010⁠,丢进位后为01111010=+12201111010=+122⁠。

两个负数相加得正数,溢出了。因为真实结果−134-134小于 8 位补码的下限−128-128⁠。需要用 9 位或更多位重新计算。

5. 把十进制数 409 分别写成 8421BCD 码和余 3 码。

答案与提示

8421BCD:0100 0000 10010100\ 0000\ 1001⁠。

余 3 码:每位加 3,4+3=7 → 0111,0+3=3 → 0011,9+3=12 → 1100,即0111 0011 11000111\ 0011\ 1100⁠。

6. (1) 把二进制01110111转为格雷码;(2) 把格雷码11111111转为二进制。

答案与提示

(1) G3=0G_3=0⁠,G2=0⊕1=1G_2=0\oplus1=1⁠,G1=1⊕1=0G_1=1\oplus1=0⁠,G0=1⊕1=0G_0=1\oplus1=0⁠,得01000100(表中序号 7 ✓)。

(2) B3=1B_3=1⁠,B2=1⊕1=0B_2=1\oplus1=0⁠,B1=0⊕1=1B_1=0\oplus1=1⁠,B0=1⊕1=0B_0=1\oplus1=0⁠,得10101010(即 10,表中序号 10 的格雷码是 1111 ✓)。

7. 信息位为11001100⁠,求奇校验位;若接收端收到1110 11110\,1(最后一位为校验位),按奇校验判断是否出错。

答案与提示

11001100有 2 个 1(偶数),奇校验位取 1,发送1100 11100\,1⁠。

收到1110 11110\,1⁠:1 的个数为 4(偶数),不满足奇校验,判定出错(实际是第 3 位被翻转了,但校验码本身指不出是哪一位)。

8.(华师风格)某电路输入 4 位二进制数b3b2b1b0b_3b_2b_1b_0⁠,当其中有奇数个 1 时输出Y=1Y=1⁠,否则Y=0Y=0⁠。(1) 输入10111011⁠、01100110时YY各为多少?(2) 用异或运算写出YY的表达式。

答案与提示

(1) 10111011有 3 个 1,Y=1Y=1⁠;01100110有 2 个 1,Y=0Y=0⁠。

(2) Y=b3⊕b2⊕b1⊕b0Y=b_3\oplus b_2\oplus b_1\oplus b_0⁠。验证:1⊕0⊕1⊕1=11\oplus0\oplus1\oplus1=1 ✓,0⊕1⊕1⊕0=00\oplus1\oplus1\oplus0=0 ✓。

这就是 2026 回忆题第 6 题的核心表达式,完整的设计步骤(真值表 → 表达式 → 用 3 个两输入异或门级联实现)见第 08 讲。


下一讲预告

第 02 讲(上):进入逻辑代数——与、或、非三种基本运算,以及与非、或非、与或非、异或、同或这些复合逻辑,配逻辑门符号对照图。

👉 点击进入下一讲:第02讲(上)|逻辑代数的三种基本运算与复合逻辑

评论

还没有评论。 来写第一条。

留下一条评论

选填,不会公开

纯文本,链接会自动识别。