首页/计算机组成原理/02-data-representation/补码乘法手算详解 🔗 在 Obsidian 中打开
计算机组成原理 · 02-data-representation

补码乘法手算详解

重要度 ⭐⭐ 考查频率 低题型 计算 / 简答 计算机组成原理补码乘法Booth算法408计算机组成原理/数据表示
速查
Booth 算法比较乘数相邻两位 Y₀Y₋₁ 决定加 / 减 / 不动01 → +[x]补10 → +[−x]补00 / 11 → 只右移;符号位参与运算,无需单独处理。

速查

项目
Booth 算法比较相邻两位,决定加/减/不操作
部分积初始为 0,共 $n+1$ 位(循环 $n$ 步)
符号位参与运算,不需要单独处理

核心概念

补码乘法 vs 原码乘法

比较项原码乘法补码乘法(Booth)
符号处理单独处理符号位符号位参与运算
部分积加法 + 移位加/减法 + 算术右移
结果需要修正符号直接得到补码结果
效率一般更高效

Booth 算法原理

Booth 算法通过观察相邻两位的跳变来决定操作:

$y_i$$y_{i-1}$操作说明
00只右移连续 0,跳过
01$+[x]_补$,然后右移0→1,开始一段 1
10$-[x]_补$,然后右移1→0,结束一段 1
11只右移连续 1,跳过
核心思想将一串连续的 1(如 011110)转化为高位减、低位加100000 - 000010),从而减少加法次数

Booth 算法步骤

设被乘数 [x]补,乘数 [y]补,均为 n 位(含符号位)

初始化:
  A = 0(n+1 位,含附加位)
  Y = [y]补(n 位)
  Y₋₁ = 0(附加位,初始为0)
  计数器 = n

循环 n 次:
  1. 检查 Y 的最低位 Y₀ 和附加位 Y₋₁:
     - 若 Y₀Y₋₁ = 01: A = A + [x]补
     - 若 Y₀Y₋₁ = 10: A = A + [-x]补
     - 若 Y₀Y₋₁ = 00 或 11: 不操作
  2. 算术右移 A 和 Y(A 的最低位移入 Y 的最高位,Y₋₁ 移出 Y₀)
     Y₋₁ = Y₀(原来的最低位)

  (实际操作中 Y₋₁ 就是移位前 Y 的最低位)

最终结果:A 和 Y 拼接(共 2n 位,A 为高 n+1 位取高 n 位,Y 为低 n 位)
注意:结果取 A 的高 n 位 + Y 的 n 位 = 2n 位补码

手算示例

例题 1:Booth 算法手算

题目: $x = -3,\ y = 5$,用 4 位补码 Booth 算法求 $x \times y$。

准备(4 位补码):

[x]补 = 1101, [-x]补 = 0011
[y]补 = 0101
A = 00000(5位),Y = 0101, Y₋₁ = 0
步骤Y₀Y₋₁操作A(5位)Y(4位)Y₋₁
初始0000001010
110$A = A + [-x]_补$0001101010
算术右移0000110101
201$A = A + [x]_补$1111010101
算术右移1111101010
310$A = A + [-x]_补$0001001010
算术右移0000100101
401$A = A + [x]_补$1111000101
算术右移1111100010

结果: $A = 11111,\ Y = 0001$。取 A 高 4 位 1111,拼接 $Y$ 得 1111_0001

验证: 11110001 是 8 位补码,真值 $= -(0000\,1111)_2 = -15$,而 $(-3) \times 5 = -15$ ✓

例题 2:手算验证技巧

题目: 快速验证 $-7 \times 4$ 的 4 位补码乘法结果。

直接计算:

(-7) × 4 = -28

8 位补码表示 -28:
28 = 0001 1100
取反加一 = 1110 0100

结果应为 1110 0100

Booth 算法验证(4 位):

[x]补 = 1001, [-x]补 = 0111
[y]补 = 0100

步1: Y₀Y₋₁ = 00, 不操作, 右移 → A=00000, Y=0010, Y₋₁=0
步2: Y₀Y₋₁ = 00, 不操作, 右移 → A=00000, Y=0001, Y₋₁=0
步3: Y₀Y₋₁ = 10, A=A+[-x]补=00111, 右移 → A=00011, Y=1000, Y₋₁=1
步4: Y₀Y₋₁ = 01, A=A+[x]补=11100, 右移 → A=11110, Y=0100, Y₋₁=0

结果: A=11110, Y=0100 → 1110_0100 = -28 ✓

例题 3:符号位分析

题目: 分析为什么补码乘法中,A 需要 $n+1$ 位。

解答:

  • 部分积 A 可能出现正溢出(被乘数为负,乘数某步做 $-[x]_补$)。
  • $n+1$ 位保证了算术右移时不丢失符号信息
  • 最终结果取 A 的高 $n$ 位 + Y 的 $n$ 位 $= 2n$ 位。

与原码乘法的对比

方面原码一位乘Booth 补码乘
部分积操作仅加法加法或减法
移位逻辑右移算术右移
符号最后单独确定运算中自然产生
判断条件乘数位为 1 则加相邻两位跳变决定
硬件复杂度较低稍高
一句话区分原码乘"看当前位、逻辑右移、最后补符号";Booth 乘"看相邻两位、算术右移、符号自然正确"。

408 考试要点

高频设问
  1. 手算 Booth 乘法:给定两个数,手动模拟每一步。
  2. 判断加/减/移位:根据 Y₀ 和 Y₋₁ 的组合决定操作。
  3. 结果验证:用十进制乘法验证补码结果。
  4. 位数问题:注意 A 的位数为 $n+1$ 位。
易错移位必须是算术右移(高位补符号位),若误用逻辑右移,负部分积会立刻变成大正数,结果全错。

记忆卡片

Booth 算法中 Y₀Y₋₁ 的四种组合分别做什么操作?
00→右移,01→加 $[x]_补$ 再右移,10→加 $[-x]_补$ 再右移,11→右移。记忆:相同不动,01 加,10 减
为什么部分积 A 要用 $n+1$ 位?
防止加法溢出。被乘数为负时,加上其绝对值($[-x]_补$)可能产生进位,多一位用于保存符号扩展。
Booth 算法用的是什么移位?为什么?
算术右移。A 中是有符号数的补码,算术右移保持符号位不变(高位补符号位)。
附加位 Y₋₁ 初始值是什么?
0。它与乘数最低位 Y₀ 组成 10 时,第一次判断即可触发加 $[-x]_补$ 操作。
$n$ 位补码 Booth 乘法循环多少次?移位多少次?
循环 $n$ 次($n$ 为含符号位的数据位数),每次最多一次加/减法和一次移位,共 $n$ 次移位。
最终乘积如何拼装?
取 A 的高 $n$ 位 + Y 的 $n$ 位,得到 $2n$ 位补码结果。

交互动画 · Booth 算法逐步演算($-3 \times 5$)

初始状态 A(部分积,5 位) Y(乘数,4 位) Y₋₁ 0 0 0 0 0 0 1 0 1 0 判定规则(看 Y₀Y₋₁) 00 只右移 01 +[x]补 10 +[-x]补 11 只右移 A = 00000, Y = 0101, Y₋₁ = 0
点击「播放」或「下一步」逐步观察 Booth 算法
被乘数 [x]补 = 1101,[-x]补 = 0011,乘数 [y]补 = 0101
示意图:橙色高亮为本步参与判定的 Y₀Y₋₁;下方胶囊标出命中的 Booth 判定规则。共 4 轮「判定 → 算术右移」,最终 A 高 4 位与 Y 拼接即为 8 位乘积。

相关知识点

(暂无关联知识点)

↑ 站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。