Note

本章回答一个核心问题:数字电路怎样用有限的 0 和 1 表示、运算、传输并校验现实世界的信息?建议先掌握“位权”这个总原则,再学习进制转换、补码运算和编码。

本章导航

  1. 十进制与二进制的位权结构
  2. 二进制与十进制互换、二进制四则运算
  3. 反码、补码和有符号数
  4. 十六进制、八进制及其快速互换
  5. BCD、Gray、ASCII、Unicode 等编码
  6. 奇偶校验、CRC 与 Hamming 码

2.1 十进制:位权是所有进制的共同语言

十进制数字的位权位置关系也可由下图直观看出。

十进制位权示意

图 2-0 十进制数字位置与位权。

十进制使用 0~9 十个符号;一个数字的意义由“数字 × 所在位置的权”决定。整数位从小数点向左依次是 ,小数位向右依次是

例如 。又如:

例 2-1 将 47 写成各位数字值之和:。相关题:求 939 中每个 9、3、9 的位值。

例 2-2 将 展开如上。计算器练习:。检查题要会判断 7 在 1370、6725、7051、58.72 中分别具有 10、100、1000、0.1 的权。

2.2 二进制数

二进制只有 0、1 两个数字,位权为 。最右位称最低有效位(LSB),最左位称最高有效位(MSB)。小数点右侧的权为

计数与位数范围

四位二进制从 0000 数到 1111,即十进制 0~15。一般地, 位无符号数可表示 种状态,最大值为:

因此 5 位最大 31,6 位最大 63,8 位最大 255。计数器可把传感器脉冲变成二进制状态,再由译码器驱动七段显示器。例如网球计数器数到 9(1001)后换箱并清零。

四位计数器驱动显示器

图 2-1 简单二进制计数应用。

二进制位权与二进制转十进制

整数权从右到左为 ;小数权从左到右为 。只需把所有为 1 的位权相加,0 位权直接忽略。

例 2-3 。相关题:

例 2-4 。相关题:

Success

看到二进制小数时,先在小数点下方写出 0.5、0.25、0.125、0.0625……,再挑出 1 所对应的权相加,最不容易出错。

2.3 十进制转二进制

位权法

寻找能够相加得到目标数的二进制权。9=8+1=,所以

例 2-5

位权法十进制转二进制示例

相关题: 转二进制。

连续除 2 法(整数)

不断用 2 除商,记录余数,直到商为 0;从最后一个余数倒着读,首个余数就是 LSB,末个余数就是 MSB。

连续除 2 法示意

例 2-6 19 连续除 2 得余数(1、1、0、0、1),倒序为 ;45 得 。计算器练习中,,相关题为

十进制转二进制计算过程

除 2 法结果示意

小数转二进制

位权法示例:

连续乘 2 法:把小数反复乘 2,每次取整数部分作为下一位;保留新的小数部分继续,直到为 0 或达到精度。 取 0, 取 1, 取 0, 取 1,所以

连续乘 2 法

2.4 二进制算术

加法

四条基本规则:(本列写 0,向左进 1)。有进位时还要把进位加入本列。

例 2-7

  • (3+3=6)。
  • (4+2=6)。
  • (7+3=10)。
  • (6+4=10)。

减法

。遇到 时,向左借 1;本位得到二进制 10,故

例 2-8 (3-1=2);(3-2=1)。例 2-9 (5-3=2),右列借位后再逐列相减。相关题:

乘法与除法

乘法规则和十进制 0、1 乘法相同:只要有一个因子为 0,积为 0;。每一行部分积左移一位,再相加。

例 2-10 (3×3=9);(5×7=35)。相关题:

二进制除法与十进制长除法完全同构。

例 2-11 (6÷3=2);(6÷2=3)。相关题:

2.5 反码与补码

1 的反码:逐位翻转,0↔1。例如 。数字电路中可用一排 NOT 门实现。

反相器产生反码

图 2-2 用反相器得到反码。

2 的补码:反码加 1,即

例 2-12 

另一种快速法:从右向左照抄,直到(并包括)第一个 1;其左边所有位翻转。例 2-13

加法器产生补码

图 2-3 反相后加 1 得 2 的补码。

2.6 有符号数与浮点数

有符号数最高位是符号位:0 表示正,1 表示负。三种整数表示法为符号-数值、1 的补码、2 的补码;工程中最常用 2 的补码。

三种表示

8 位 +25 的真值为 00011001

  • 符号-数值:-25=10011001(仅符号位变 1)。
  • 1 的补码:-25=11100110
  • 2 的补码:-25=11100111

符号-数值表示

例 2-14 -39 的 8 位表示:符号-数值 10100111;1 的补码 11011000;2 的补码 11011001

例 2-15 符号-数值 10010101:符号为负,幅值位 0010101 的值为 21,故为 -21。

例 2-16 1 的补码 00010111=+23;11101000 的权和为 -24,再加 1 得 -23。

例 2-17 2 的补码 01010110=+86;10101010=-128+32+8+2=-86

Warning

1 的补码有两个零(全 0 与全 1),2 的补码只有一个零;因此 CPU 通常采用 2 的补码。n 位 2 的补码范围是 ,8 位即 -128~+127。

浮点数

浮点数由符号 、指数 、尾数/小数 组成。IEEE 单精度为 32 位:1 位符号、8 位偏置指数、23 位尾数。数值公式为:

例 2-18 ,符号位 0,偏置指数 ,尾数取小数点后的 23 位,故格式为 0 10001101 11111011100000000000000。0 用全 0 表示,指数全 1 且尾数全 0 表示无穷大。

2.7 有符号数运算

2 的补码加法只需逐位相加并丢弃最终进位。四种情况是:正+正、较大正+较小负、较大负+较小正、负+负。减法等价于“被减数 + 减数的 2 的补码”。

溢出

只有同号相加才可能溢出:正+正却得负,或负+负却得正。异号相加不会溢出。

有符号加法溢出

例 2-19 把 01000100000110110000111000010010 依次两两相加:先得第一、二数之和,再把第三、四数加入,最后得到总和;计算机累加字符串也采用此流程。

例 2-20 8 位减法:+8−(+3)=+5;+12−(−9)=+21;−25−(+19)=−44;−120−(−30)=−90。每次先求减数补码,和被减数相加并丢弃进位。

有符号乘除

乘法可用直接重复加法或部分积法。符号相同积为正,不同则为负。例 2-2101001101×00000100(77×4)用直接加法得 100110100例 2-2201010011×11000101,先确定负号,将负乘数转真值,生成部分积左移相加,最后对积求补码并加符号位。

除法可用反复减法;符号相同商为正,否则为负。例 2-2301100100÷00011001(100÷25),依次减 25 四次,商为 00000100,余数 0。

2.8 十六进制

十六进制基数为 16,符号是 0~9、A~F(A=10,B=11,C=12,D=13,E=14,F=15)。一位十六进制正好对应四位二进制。

十进制二进制十六进制
0~90000~10010~9
101010A
111011B
121100C
131101D
141110E
151111F

转换

二进制转十六进制:从右向左每 4 位分组,不足左侧补 0。例 2-241100101001010111C A 5 7,即 CA57₁₆111111000101101001 左侧补两个 0 得 3F169₁₆

十六进制转二进制:每个符号替换为 4 位。例 2-2510A4₁₆0001 0000 1010 0100CF8E₁₆1100 1111 1000 11109742₁₆逐位替换。

十六进制转二进制示例 十六进制转二进制示例

十六进制转十进制可先转二进制,也可按 加权。例 2-261C₁₆=28₁₀A85₁₆=2693₁₀例 2-27E5₁₆=229₁₀B2F8₁₆=45816₁₀

十进制转十六进制:反复除以 16,余数倒读。例 2-28650₁₀=28A₁₆

十进制转十六进制 计算器十六进制转换

十六进制加减

按列把 A~F 当作 10~15;和超过 15 时减 16 并向左进 1。例 2-2923+16=3958+22=7A2B+84=AFDF+AC=18B

十六进制加法示例

减法可把减数转成 2 的补码再相加。求十六进制补码有三法:转二进制后求补码;用最大数减该数再加 1;逐位取十六进制 1 的补码再加 1。

十六进制补码方法 1 十六进制补码方法 1 十六进制补码方法 2 十六进制补码方法 3 逐位补码示例

例 2-30 84−2A2A补码为 D684+D6=15A,丢弃进位得 5AC3−0B0B补码为 F5,结果 B8

2.9 八进制

八进制只用 0~7,位权是 。例如:

十进制转八进制用连续除 8 法,359₁₀ 的余数倒读即可得到对应八进制。

十进制转八进制

每一位八进制对应 3 位二进制:0→000,1→001,…,7→111。

例 2-3113₈→001 01125₈→010 101140₈→001 100 0007526₈→111 101 010 110

二进制转八进制从右向左每 3 位分组,左端不足补 0。例 2-32110101₂→65₈101111001₂→571₈100110011010₂→4632₈11010000100₂→3204₈

2.10 BCD(8421 码)

BCD 不把整个十进制数当作一个二进制量,而是每个十进制数字单独用 4 位表示:0~9 对应 0000100110101111 是无效码。

数字0123456789
BCD0000000100100011010001010110011110001001

例 2-33:35→0011 0101;98→1001 1000;170→0001 0111 0000;2469→0010 0100 0110 1001

BCD 编码示例 BCD 编码示例 BCD 编码示例

例 2-341000 0110→86;0011 0101 0001→351;1001 0100 0111 0000→9470。

BCD 加法:先按二进制加;若 4 位结果 >9 或产生组间进位,就加 0110 修正。

例 2-35:3+4=0011+0100=0111;23+15=0010 0011+0001 0101=0011 1000;86+13=99;450+417=867,均无需修正。例 2-36:9+4 先得 1101,再加 0110 得 0001 0011(13);9+9 因进位修正为 18;16+15→31;67+53→120。

2.11 数字编码

Gray 码

Gray 码是无权码,相邻码字只改变 1 位,适合旋转编码器,能避免多个位同时变化造成的过渡误读。4 位序列为:0000、0001、0011、0010、0110、0111、0101、0100、1100、1101、1111、1110、1010、1011、1001、1000。

二进制转 Gray:Gray 的 MSB 等于二进制 MSB;后续各位为相邻二进制位异或(相加丢进位)。Gray 转二进制:二进制 MSB 等于 Gray MSB;之后每位为前一二进制位与当前 Gray 位异或。

二进制转 Gray 规则 Gray 转二进制规则

例 2-3711000110₂→10100101 Gray10101111 Gray→11001010₂

例 2-37 二进制转 Gray 例 2-37 Gray 转二进制

Gray 码旋转编码器

图 2-7 Gray 码使轴位置编码器相邻状态仅变化一位。

ASCII 与 Unicode

ASCII(American Standard Code for Information Interchange)用 7 位表示 128 个字符,通常作为 8 位且最高位为 0 的编码;00~1F 是控制字符,20~7F 是可显示字符。例 2-38:C 语句 if (x > 5) 的 ASCII 为:i=69hf=66h、空格=20h(=28hx=78h>=3Eh5=35h) =29h。键盘扫描码会再转换成 ASCII。扩展 ASCII 使用 80h~FFh。Unicode 用统一码点覆盖世界文字,并与 ASCII 前 128 个码点兼容。

2.12 错误检测码

奇偶校验

偶校验要求整组 1 的个数为偶数,奇校验要求为奇数。发送端增加一个校验位,接收端重新计数即可检测单比特(或奇数个比特)错误,但不能可靠检测两个同时翻转的位。

偶校验检测错误 接收端发现奇偶错误

例 2-39:给 10101110001011011000111001001101101011111 加偶校验位(置于最左),结果分别为 010101111000010110101000111001011101101011111例 2-40:奇校验接收 10110、11010、110011、110101110100、1100010101010,其中 1 的个数为偶数的 1100111100010101010 出错。

CRC 与模 2 运算

CRC(循环冗余校验)用固定生成码做模 2 长除法。模 2 加/减就是 XOR:00→0,01→1,10→1,11→0,不产生借位或进位。

发送步骤:数据后补与生成码等长的 0;模 2 相除;把余数替换到附加位,使最终码再次相除余数为 0。接收端用同一生成码相除,余数非 0 即报错。

CRC 发送端 CRC 接收端

图 2-8 CRC 通信过程。

例 2-41:数据 D=11010011,生成码 G=1010。先补 4 个 0,模 2 除得余数 0100,发送码为 110100110100;再次除以 1010 余数为 0。

CRC 模 2 除法 CRC 验证余数为零

例 2-42:若传输中第二位翻转,收到 100100110100,再次除以 1010 得余数 0100,非 0,故检测到错误。

CRC 错误检测

Hamming 码通过在数据中加入位于 位置的冗余位,可定位并纠正单比特错误;经典 7 位 Hamming 码使用 4 个冗余位。

章末速记

  • n 位无符号数最大为 ;二进制转十进制就是累加 1 位权。
  • 整数除 2、十六进制除 16、八进制除 8,余数倒读。
  • 2 的补码=反码+1;同号相加才可能溢出。
  • 1 位十六进制=4 位二进制,1 位八进制=3 位二进制。
  • BCD 是“每个十进制数字各占 4 位”,不是整串数字的普通二进制。
  • Gray 码相邻只变 1 位;ASCII 用 7 位;CRC 的正确接收余数为 0。

自测题

  1. 转为十进制,并说明每一位的权。
  2. 用连续除 2 法把 转为二进制,再用位权法核对。
  3. 用 8 位 2 的补码计算 ,判断是否溢出。
  4. 3A7₁₆ 转为二进制、十进制;再将结果转为八进制。
  5. 对 BCD 1001 0111 + 0001 0101 做修正,并说明为什么要加 0110
  6. 将二进制 101101 转 Gray,再把所得 Gray 码转回二进制。
  7. 数据 10110010 使用生成码 1010 做 CRC 时,接收端余数非 0 代表什么?

自测一下