Note
本章回答一个核心问题:数字电路怎样用有限的 0 和 1 表示、运算、传输并校验现实世界的信息?建议先掌握“位权”这个总原则,再学习进制转换、补码运算和编码。
本章导航
- 十进制与二进制的位权结构
- 二进制与十进制互换、二进制四则运算
- 反码、补码和有符号数
- 十六进制、八进制及其快速互换
- BCD、Gray、ASCII、Unicode 等编码
- 奇偶校验、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-6 19 连续除 2 得余数(1、1、0、0、1),倒序为 ;45 得 。计算器练习中,,相关题为 。


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

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 把 01000100、00011011、00001110、00010010 依次两两相加:先得第一、二数之和,再把第三、四数加入,最后得到总和;计算机累加字符串也采用此流程。
例 2-20 8 位减法:+8−(+3)=+5;+12−(−9)=+21;−25−(+19)=−44;−120−(−30)=−90。每次先求减数补码,和被减数相加并丢弃进位。
有符号乘除
乘法可用直接重复加法或部分积法。符号相同积为正,不同则为负。例 2-21:01001101×00000100(77×4)用直接加法得 100110100。例 2-22:01010011×11000101,先确定负号,将负乘数转真值,生成部分积左移相加,最后对积求补码并加符号位。
除法可用反复减法;符号相同商为正,否则为负。例 2-23:01100100÷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~9 | 0000~1001 | 0~9 |
| 10 | 1010 | A |
| 11 | 1011 | B |
| 12 | 1100 | C |
| 13 | 1101 | D |
| 14 | 1110 | E |
| 15 | 1111 | F |
转换
二进制转十六进制:从右向左每 4 位分组,不足左侧补 0。例 2-24:1100101001010111→C A 5 7,即 CA57₁₆;111111000101101001 左侧补两个 0 得 3F169₁₆。
十六进制转二进制:每个符号替换为 4 位。例 2-25:10A4₁₆→0001 0000 1010 0100;CF8E₁₆→1100 1111 1000 1110;9742₁₆逐位替换。

十六进制转十进制可先转二进制,也可按 加权。例 2-26:1C₁₆=28₁₀;A85₁₆=2693₁₀。例 2-27:E5₁₆=229₁₀;B2F8₁₆=45816₁₀。
十进制转十六进制:反复除以 16,余数倒读。例 2-28:650₁₀=28A₁₆。

十六进制加减
按列把 A~F 当作 10~15;和超过 15 时减 16 并向左进 1。例 2-29:23+16=39,58+22=7A,2B+84=AF,DF+AC=18B。

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

例 2-30 84−2A:2A补码为 D6,84+D6=15A,丢弃进位得 5A;C3−0B:0B补码为 F5,结果 B8。
2.9 八进制
八进制只用 0~7,位权是 。例如:
十进制转八进制用连续除 8 法,359₁₀ 的余数倒读即可得到对应八进制。

每一位八进制对应 3 位二进制:0→000,1→001,…,7→111。
例 2-31:13₈→001 011,25₈→010 101,140₈→001 100 000,7526₈→111 101 010 110。
二进制转八进制从右向左每 3 位分组,左端不足补 0。例 2-32:110101₂→65₈;101111001₂→571₈;100110011010₂→4632₈;11010000100₂→3204₈。
2.10 BCD(8421 码)
BCD 不把整个十进制数当作一个二进制量,而是每个十进制数字单独用 4 位表示:0~9 对应 0000~1001。1010~1111 是无效码。
| 数字 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| BCD | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 |
例 2-33:35→0011 0101;98→1001 1000;170→0001 0111 0000;2469→0010 0100 0110 1001。

例 2-34:1000 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 位异或。

例 2-37:11000110₂→10100101 Gray;10101111 Gray→11001010₂。


图 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=69h、f=66h、空格=20h、(=28h、x=78h、>=3Eh、5=35h、) =29h。键盘扫描码会再转换成 ASCII。扩展 ASCII 使用 80h~FFh。Unicode 用统一码点覆盖世界文字,并与 ASCII 前 128 个码点兼容。
2.12 错误检测码
奇偶校验
偶校验要求整组 1 的个数为偶数,奇校验要求为奇数。发送端增加一个校验位,接收端重新计数即可检测单比特(或奇数个比特)错误,但不能可靠检测两个同时翻转的位。

例 2-39:给 1010、111000、101101、1000111001001、101101011111 加偶校验位(置于最左),结果分别为 01010、1111000、0101101、0100011100101、1101101011111。例 2-40:奇校验接收 10110、11010、110011、110101110100、1100010101010,其中 1 的个数为偶数的 110011 和 1100010101010 出错。
CRC 与模 2 运算
CRC(循环冗余校验)用固定生成码做模 2 长除法。模 2 加/减就是 XOR:00→0,01→1,10→1,11→0,不产生借位或进位。
发送步骤:数据后补与生成码等长的 0;模 2 相除;把余数替换到附加位,使最终码再次相除余数为 0。接收端用同一生成码相除,余数非 0 即报错。

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

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

Hamming 码通过在数据中加入位于 位置的冗余位,可定位并纠正单比特错误;经典 7 位 Hamming 码使用 4 个冗余位。
章末速记
- n 位无符号数最大为 ;二进制转十进制就是累加 1 位权。
- 整数除 2、十六进制除 16、八进制除 8,余数倒读。
- 2 的补码=反码+1;同号相加才可能溢出。
- 1 位十六进制=4 位二进制,1 位八进制=3 位二进制。
- BCD 是“每个十进制数字各占 4 位”,不是整串数字的普通二进制。
- Gray 码相邻只变 1 位;ASCII 用 7 位;CRC 的正确接收余数为 0。
自测题
- 将 转为十进制,并说明每一位的权。
- 用连续除 2 法把 转为二进制,再用位权法核对。
- 用 8 位 2 的补码计算 ,判断是否溢出。
- 将
3A7₁₆转为二进制、十进制;再将结果转为八进制。 - 对 BCD
1001 0111 + 0001 0101做修正,并说明为什么要加0110。 - 将二进制
101101转 Gray,再把所得 Gray 码转回二进制。 - 数据
10110010使用生成码1010做 CRC 时,接收端余数非 0 代表什么?
自测一下
为什么二进制位权能直接用于进制转换?
参考答案:因为任何进制的数都是”各位数字 × 对应位权”之和,二进制的权就是 …、8、4、2、1 和 0.5、0.25、0.125…。转十进制时只要把为 1 的位权相加,如 ;反过来把十进制数分解成若干权之和(如 ),或用连续除 2 取余数倒读,就完成了十进制转二进制。位权是所有进制转换共同的总原则。
补码表示有符号数时,最高位具有什么含义?
参考答案:最高位是符号位:0 表示正数,1 表示负数;同时它还带着 的权参与求值。例如 8 位
10101010按权相加得 。因此 n 位 2 的补码表示范围是 到 ,8 位即 -128~+127,且只有一个零,这也是 CPU 采用 2 的补码的原因。
BCD 码与普通二进制数有什么区别?
参考答案:普通二进制把整个十进制数当作一个二进制量整体转换,而 BCD 是每个十进制数字单独用 4 位表示,0~9 对应
0000~1001,1010~1111是无效码。例如十进制 35 的 BCD 是0011 0101,而普通二进制是 。BCD 加法先按二进制相加,若某组 4 位结果大于 9 或产生组间进位,就要加0110修正,如 9+4 先得 1101,再加 0110 得0001 0011(13)。
Gray 码为何适合旋转编码器?
参考答案:Gray 码的关键特性是相邻两个码字只改变 1 位。旋转编码器的位置连续变化时,若用普通二进制,多位同时翻转会因各位快慢不一而被误读到中间错误状态;Gray 码每次只有一位变化,就避免了这种过渡误读。转换方法是:Gray 的 MSB 等于二进制 MSB,其余各位由相邻二进制位异或(相加丢进位)得到,如
11000110₂→10100101Gray。
CRC 校验相比奇偶校验有什么优势?
参考答案:奇偶校验只增加 1 位,只能检测奇数个比特出错,两位同时翻转就查不出来。CRC 用固定生成码对数据做模 2 除法(加减即 XOR),把余数附在数据后发送,接收端用同一生成码再除,余数为 0 才判定正确。例如数据
11010011用生成码1010得发送码110100110100;若传输中一位翻转,再除得余数0100非 0,即可检测到错误。