| 项目 | 值 |
|---|---|
| Booth 算法 | 比较相邻两位,决定加/减/不操作 |
| 部分积 | 初始为 0,共 $n+1$ 位(循环 $n$ 步) |
| 符号位 | 参与运算,不需要单独处理 |
| 比较项 | 原码乘法 | 补码乘法(Booth) |
|---|---|---|
| 符号处理 | 单独处理符号位 | 符号位参与运算 |
| 部分积 | 加法 + 移位 | 加/减法 + 算术右移 |
| 结果 | 需要修正符号 | 直接得到补码结果 |
| 效率 | 一般 | 更高效 |
Booth 算法通过观察相邻两位的跳变来决定操作:
| $y_i$ | $y_{i-1}$ | 操作 | 说明 |
|---|---|---|---|
0 | 0 | 只右移 | 连续 0,跳过 |
0 | 1 | $+[x]_补$,然后右移 | 0→1,开始一段 1 |
1 | 0 | $-[x]_补$,然后右移 | 1→0,结束一段 1 |
1 | 1 | 只右移 | 连续 1,跳过 |
011110)转化为高位减、低位加(100000 - 000010),从而减少加法次数。设被乘数 [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 位补码
题目: $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₋₁ |
|---|---|---|---|---|---|
| 初始 | — | — | 00000 | 0101 | 0 |
| 1 | 10 | $A = A + [-x]_补$ | 00011 | 0101 | 0 |
| 算术右移 | 00001 | 1010 | 1 | ||
| 2 | 01 | $A = A + [x]_补$ | 11110 | 1010 | 1 |
| 算术右移 | 11111 | 0101 | 0 | ||
| 3 | 10 | $A = A + [-x]_补$ | 00010 | 0101 | 0 |
| 算术右移 | 00001 | 0010 | 1 | ||
| 4 | 01 | $A = A + [x]_补$ | 11110 | 0010 | 1 |
| 算术右移 | 11111 | 0001 | 0 |
结果: $A = 11111,\ Y = 0001$。取 A 高 4 位 1111,拼接 $Y$ 得 1111_0001。
验证: 11110001 是 8 位补码,真值 $= -(0000\,1111)_2 = -15$,而 $(-3) \times 5 = -15$ ✓
题目: 快速验证 $-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 ✓
题目: 分析为什么补码乘法中,A 需要 $n+1$ 位。
解答:
| 方面 | 原码一位乘 | Booth 补码乘 |
|---|---|---|
| 部分积操作 | 仅加法 | 加法或减法 |
| 移位 | 逻辑右移 | 算术右移 |
| 符号 | 最后单独确定 | 运算中自然产生 |
| 判断条件 | 乘数位为 1 则加 | 相邻两位跳变决定 |
| 硬件复杂度 | 较低 | 稍高 |
10 时,第一次判断即可触发加 $[-x]_补$ 操作。(暂无关联知识点)
↑ 站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。