logo
导航

练习题

练习题

数制转换

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
0000
0011
0101
0110
1001
1010
1100
1111

步骤 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 求和)
  • 在关键计算中使用定点数
  • 进行误差分析和控制

答案: 浮点数运算存在精度问题,需要采用适当的算法和数据类型来减少误差