练习题
解题思路:
把十进制数 123 转换为二进制、八进制和十六进制时,对目标进制反复做除法,收集各次余数,再从下往上读出结果。
详细步骤:
解答:
转换为二进制:
123 ÷ 2 = 61 余 1
61 ÷ 2 = 30 余 1
30 ÷ 2 = 15 余 0
15 ÷ 2 = 7 余 1
7 ÷ 2 = 3 余 1
3 ÷ 2 = 1 余 1
1 ÷ 2 = 0 余 1
从下往上读:123₁₀ = 1111011₂
转换为八进制:
123 ÷ 8 = 15 余 3
15 ÷ 8 = 1 余 7
1 ÷ 8 = 0 余 1
从下往上读:123₁₀ = 173₈
转换为十六进制:
123 ÷ 16 = 7 余 11 (B)
7 ÷ 16 = 0 余 7
从下往上读:123₁₀ = 7B₁₆
答案: 123₁₀ = 1111011₂ = 173₈ = 7B₁₆
最终答案:
123₁₀ = 1111011₂ = 173₈ = 7B₁₆.
解题思路:
把二进制数 11010101 转换为十进制时,按位权展开后逐项求和。
详细步骤:
解答:
使用位权展开法:
11010101₂ = 1×2⁷ + 1×2⁶ + 0×2⁵ + 1×2⁴ + 0×2³ + 1×2² + 0×2¹ + 1×2⁰
= 1×128 + 1×64 + 0×32 + 1×16 + 0×8 + 1×4 + 0×2 + 1×1
= 128 + 64 + 0 + 16 + 0 + 4 + 0 + 1
= 213
答案: 11010101₂ = 213₁₀
最终答案:
11010101₂ = 213₁₀.
解题思路:
用 8 位补码表示 -45 并计算 -45 + 23 时,先求绝对值的二进制表示,按取反加一得到补码,再对两个 8 位补码做加法。
详细步骤:
解答:
步骤 1:求 -45 的 8 位补码
- 45 的二进制表示:00101101
- 求反码:11010010
- 加 1 得到补码:11010011
步骤 2:求 23 的 8 位补码
- 23 的二进制表示:00010111(正数补码等于原码)
步骤 3:相加
11010011 (-45)
- 00010111 (23)
= 11101010
步骤 4:判断结果
- 最高位为 1,表示负数
- 求补码的绝对值:00010110 = 22
- 所以结果是 -22
验证: -45 + 23 = -22 ✓
答案: -45 的 8 位补码是 11010011,-45 + 23 = -22
最终答案:
-45 的 8 位补码为 11010011,且 -45 + 23 = -22。
验证:-45 + 23 = -22 ✓
解题思路:
判断 8 位补码运算 100 + 50 是否溢出时,先把两个操作数转换为补码并相加,再把结果的符号与操作数的符号作比较。
详细步骤:
解答:
步骤 1:转换为 8 位补码
- 100 的 8 位补码:01100100
- 50 的 8 位补码:00110010
步骤 2:相加
01100100 (100)
- 00110010 (50)
= 10010110
步骤 3:分析溢出
- 两个正数相加得到负数(最高位为 1)
- 这是符号位溢出,表示发生了溢出
步骤 4:验证
- 100 + 50 = 150
- 8 位有符号数范围是 -128 到 127
- 150 超出了这个范围,确实溢出
答案: 发生溢出,因为两个正数相加得到负数
最终答案:
发生了溢出,因为两个正数相加却得到了负数结果。
解题思路:
把十进制数 12.375 转换为 IEEE 754 单精度浮点数时,先转成二进制并规格化,再拼装符号位、阶码和尾数。
详细步骤:
解答:
步骤 1:转换为二进制
- 整数部分:12 = 1100₂
- 小数部分:0.375 × 2 = 0.75 → 0
- 0.75 × 2 = 1.5 → 1
- 0.5 × 2 = 1.0 → 1
- 所以 0.375 = 0.011₂
- 12.375 = 1100.011₂
步骤 2:规格化
- 1100.011₂ = 1.100011₂ × 2³
- 尾数:100011(去掉隐含的 1)
- 指数:3 + 127 = 130 = 10000010₂
步骤 3:组合
- 符号位:0(正数)
- 指数位:10000010
- 尾数位:10001100000000000000000
- 结果:0 10000010 10001100000000000000000
答案: 0 10000010 10001100000000000000000
最终答案:
0 10000010 10001100000000000000000.
解题思路:
把 IEEE 754 单精度值 0x42280000 转换为十进制时,先展开成二进制并拆分为三个字段,再求它所表示的数值。
详细步骤:
解答:
步骤 1:转换为二进制
- 0x42280000 = 01000010 00101000 00000000 00000000
步骤 2:分解
- 符号位:0(正数)
- 指数位:10000100 = 132
- 尾数位:01010000000000000000000
步骤 3:计算
- 实际指数:132 - 127 = 5
- 尾数:1.0101₂(加上隐含的 1)
- 数值:1.0101₂ × 2⁵ = 101010₂ = 42₁₀
答案: 42.0
最终答案:
42.0.
解题思路:
化简逻辑表达式 F = A’B + AB’ + AB 时,用分配律提取公因子 A,用互补律消去括号,再化简剩余的与或和。
详细步骤:
解答:
步骤 1:使用分配律
F = A’B + AB’ + AB
= A’B + A(B’ + B)
步骤 2:使用互补律
B’ + B = 1
F = A’B + A(1)
F = A’B + A
步骤 3:使用分配律
F = A’B + A
= A’B + A(1)
= A’B + A(B + B’)
= A’B + AB + AB’
= (A’ + A)B + AB’
= B + AB’
步骤 4:进一步化简
F = B + AB’
= B + AB’
= B + AB’ + BB’ (B = B + BB’)
= B + (A + B)B’
= B + B’ (因为 A + B = 1)
= 1
答案: F = 1(恒真)
最终答案:
F = 1,即该表达式恒为真。
解题思路:
为 3 位二进制数设计奇偶校验电路时,先定义输入与输出,列出真值表并导出逻辑表达式,再用异或门实现。
详细步骤:
解答:
步骤 1:定义输入输出
- 输入:3 位二进制数 A₂A₁A₀
- 输出:奇偶校验位 P
步骤 2:真值表
| A₂ | A₁ | A₀ | P |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 |
| 0 | 1 | 0 | 1 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 0 |
| 1 | 1 | 1 | 1 |
步骤 3:逻辑表达式
P = A₂ ⊕ A₁ ⊕ A₀
步骤 4:电路实现 使用两个异或门:
- 第一个异或门:A₂ ⊕ A₁
- 第二个异或门:(A₂ ⊕ A₁) ⊕ A₀
答案: P = A₂ ⊕ A₁ ⊕ A₀
最终答案:
P = A₂ ⊕ A₁ ⊕ A₀,用两级级联的异或门实现。
解题思路:
用 Booth 算法计算 7 × (-3) 时,先把操作数转为二进制并为乘数补上符号位,然后逐步行进算法,每步加上或减去被乘数并右移。
详细步骤:
解答:
步骤 1:转换为二进制
- 7 = 0111₂
- -3 的 8 位补码:11111101
步骤 2:扩展乘数
- 7 = 00000111₂(8 位)
- 添加符号位:00000111₂
步骤 3:Booth 算法
初始:A = 00000000,Q = 00000111,Q₋₁ = 0
| 步骤 | Q₀Q₋₁ | 操作 | 右移后结果 |
|---|---|---|---|
| 1 | 10 | A = A − M = 00000000 − 11111101 = 00000011 | A = 00000001,Q = 10000011,Q₋₁ = 1 |
| 2 | 11 | 无操作 | A = 00000000,Q = 11000001,Q₋₁ = 1 |
| 3 | 11 | 无操作 | A = 00000000,Q = 11100000,Q₋₁ = 1 |
| 4 | 01 | A = A + M = 00000000 + 11111101 = 11111101 | A = 11111110,Q = 01110000,Q₋₁ = 0 |
| 5 | 00 | 无操作 | A = 01111111,Q = 00111000,Q₋₁ = 0 |
| 6 | 00 | 无操作 | A = 00111111,Q = 10011100,Q₋₁ = 0 |
| 7 | 10 | A = A − M = 00111111 − 11111101 = 01000010 | A = 00100001,Q = 11001110,Q₋₁ = 0 |
| 8 | 00 | 无操作 | A = 00010000,Q = 11100111,Q₋₁ = 0 |
步骤 4:结果
- 最终 A = 00010000, Q = 11100111
- 结果:0001000011100111₂ = 11100111₂ = -21₁₀
验证: 7 × (-3) = -21 ✓
答案: 7 × (-3) = -21
最终答案:
7 × (-3) = -21。
验证:7 × (-3) = -21 ✓
解题思路:
设计 4 位全加器时,先定义输入输出并导出单个全加器的逻辑方程,再把四个级联起来,最后列表说明进位如何在各级之间传递。
详细步骤:
解答:
步骤 1:定义输入输出
- 输入:A₃A₂A₁A₀, B₃B₂B₁B₀, C_in
- 输出:S₃S₂S₁S₀, C_out
步骤 2:单个全加器
S_i = A_i ⊕ B_i ⊕ C_i
C_{i+1} = A_iB_i + (A_i ⊕ B_i)C_i
步骤 3:4 位全加器连接
FA0: S₀ = A₀ ⊕ B₀ ⊕ C_in, C₁ = A₀B₀ + (A₀ ⊕ B₀)C_in
FA1: S₁ = A₁ ⊕ B₁ ⊕ C₁, C₂ = A₁B₁ + (A₁ ⊕ B₁)C₁
FA2: S₂ = A₂ ⊕ B₂ ⊕ C₂, C₃ = A₂B₂ + (A₂ ⊕ B₂)C₂
FA3: S₃ = A₃ ⊕ B₃ ⊕ C₃, C_out = A₃B₃ + (A₃ ⊕ B₃)C₃
步骤 4:电路图
4 位行波进位加法器由 FA0 ~ FA3 串联而成,低位进位逐级传递:
| 全加器 | 输入 | 输出 |
|---|---|---|
| FA0 | A₀、B₀、C_in | S₀、C₁ |
| FA1 | A₁、B₁、C₁ | S₁、C₂ |
| FA2 | A₂、B₂、C₂ | S₂、C₃ |
| FA3 | A₃、B₃、C₃ | S₃、C_out |
答案: 使用 4 个全加器级联,每个全加器处理一位,进位信号连接相邻位
最终答案:
采用四个级联的全加器,每个全加器处理一位,各级之间的进位输出接到下一级的进位输入。
解题思路:
设计支持加、减、与、或运算的简单 ALU 时,先定义输入输出、分配操作码、搭建并行数据通路,再用多路选择器选出结果。
详细步骤:
解答:
步骤 1:定义输入输出
- 输入:A[3:0], B[3:0], OP[1:0]
- 输出:RESULT[3:0], ZERO, CARRY
步骤 2:操作码定义
- OP = 00:加法
- OP = 01:减法
- OP = 10:与运算
- OP = 11:或运算
步骤 3:逻辑设计
- 加法器:ADD_RESULT = A + B;CARRY = (A + B) > 15
- 减法器:SUB_RESULT = A − B;CARRY = A < B
- 逻辑运算:AND_RESULT = A & B;OR_RESULT = A | B
- 多路选择器:RESULT = OP[1] ? (OP[0] ? OR_RESULT : AND_RESULT) : (OP[0] ? SUB_RESULT : ADD_RESULT)
- 零标志:ZERO = (RESULT == 0)
步骤 4:电路实现
数据通路:A[3:0]、B[3:0] 与 OP[1:0] 输入 → 4 位加法器 / 4 位减法器 / 逻辑运算单元并行计算 → 4:1 多路选择器按 OP 选结果 → 零检测器 → 输出 RESULT[3:0]、ZERO、CARRY。
答案: 使用加法器、减法器、逻辑运算单元和多路选择器组合实现
最终答案:
将加法器、减法器、逻辑部件和多路选择器组合起来,用操作码选择输出哪一个结果。
解题思路:
分析浮点运算的精度问题时,先找出精度损失的来源,用一个具体例子推演,追踪误差的累积过程,再列出控制误差的手段。
详细步骤:
解答:
步骤 1:精度损失原因
- 二进制无法精确表示某些十进制小数
- 规格化过程中的舍入误差
- 运算过程中的累积误差
步骤 2:示例分析
0.1₁₀ = 0.0001100110011…₂(无限循环)
在单精度浮点数中只能存储有限位,造成精度损失
步骤 3:误差累积
0.1 + 0.1 + 0.1 ≠ 0.3
因为每个0.1都有舍入误差,累积后误差增大
步骤 4:解决方案
- 使用更高精度的数据类型(双精度)
- 采用特殊的数值算法(如 Kahan 求和)
- 在关键计算中使用定点数
- 进行误差分析和控制
答案: 浮点数运算存在精度问题,需要采用适当的算法和数据类型来减少误差
最终答案:
浮点运算确实存在精度问题,因此需要合理选择算法和数据类型,把误差控制在较小范围内。
