练习题
练习题
数制转换
1. 将十进制数 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₁₆
2. 将二进制数 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₁₀
补码运算
3. 用8位补码表示 -45,并计算 -45 + 23
解答:
步骤 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
4. 判断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 超出了这个范围,确实溢出
答案: 发生溢出,因为两个正数相加得到负数
浮点数表示
5. 将十进制数 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
6. 将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
逻辑运算
7. 化简逻辑表达式 F = A’B + AB’ + AB
解答:
步骤 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(恒真)
8. 设计一个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₀
算术运算
9. 使用Booth算法计算 7 × (-3)
解答:
步骤 1:转换为二进制
- 7 = 0111₂
- -3 的 8 位补码:11111101
步骤 2:扩展乘数
- 7 = 00000111₂(8 位)
- 添加符号位:00000111₂
步骤 3:Booth 算法
初始:A = 00000000, Q = 00000111, Q₋₁ = 0
步骤1:Q₀Q₋₁ = 10,A = A - M = 00000000 - 11111101 = 00000011
右移:A = 00000001, Q = 10000011, Q₋₁ = 1
步骤2:Q₀Q₋₁ = 11,无操作
右移:A = 00000000, Q = 11000001, Q₋₁ = 1
步骤3:Q₀Q₋₁ = 11,无操作
右移:A = 00000000, Q = 11100000, Q₋₁ = 1
步骤4:Q₀Q₋₁ = 01,A = A + M = 00000000 + 11111101 = 11111101
右移:A = 11111110, Q = 01110000, Q₋₁ = 0
步骤5:Q₀Q₋₁ = 00,无操作
右移:A = 01111111, Q = 00111000, Q₋₁ = 0
步骤6:Q₀Q₋₁ = 00,无操作
右移:A = 00111111, Q = 10011100, Q₋₁ = 0
步骤7:Q₀Q₋₁ = 10,A = A - M = 00111111 - 11111101 = 01000010
右移:A = 00100001, Q = 11001110, Q₋₁ = 0
步骤8:Q₀Q₋₁ = 00,无操作
右移:A = 00010000, Q = 11100111, Q₋₁ = 0
步骤 4:结果
- 最终 A = 00010000, Q = 11100111
- 结果:0001000011100111₂ = 11100111₂ = -21₁₀
验证: 7 × (-3) = -21 ✓
答案: 7 × (-3) = -21
10. 设计一个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:电路图
A₃ ──┐ A₂ ──┐ A₁ ──┐ A₀ ──┐
B₃ ──┤ B₂ ──┤ B₁ ──┤ B₀ ──┤
C₃ ──┘ C₂ ──┘ C₁ ──┘ C_in ─┘
│ │ │ │
│ │ │ │
FA3 FA2 FA1 FA0
│ │ │ │
│ │ │ │
S₃ S₂ S₁ S₀
│
C_out
答案: 使用 4 个全加器级联,每个全加器处理一位,进位信号连接相邻位
综合应用题
11. 设计一个简单的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多路器 │
└─────┬─────┘
│
┌─────┴─────┐
│ 零检测器 │
└─────┬─────┘
│
RESULT[3:0]
ZERO
CARRY
答案: 使用加法器、减法器、逻辑运算单元和多路选择器组合实现
12. 分析浮点数运算的精度问题
解答:
步骤 1:精度损失原因
- 二进制无法精确表示某些十进制小数
- 规格化过程中的舍入误差
- 运算过程中的累积误差
步骤 2:示例分析
0.1₁₀ = 0.0001100110011...₂(无限循环)
在单精度浮点数中只能存储有限位,造成精度损失
步骤 3:误差累积
0.1 + 0.1 + 0.1 ≠ 0.3
因为每个0.1都有舍入误差,累积后误差增大
步骤 4:解决方案
- 使用更高精度的数据类型(双精度)
- 采用特殊的数值算法(如 Kahan 求和)
- 在关键计算中使用定点数
- 进行误差分析和控制
答案: 浮点数运算存在精度问题,需要采用适当的算法和数据类型来减少误差