原码一位乘法是计算机实现乘法运算的基本方法。核心思想是逐位判断乘数,决定是否加被乘数,然后右移部分积。
| 特性 | 说明 |
|---|---|
| 符号处理 | 符号位单独计算:$S = X_s \oplus Y_s$(异或) |
| 数值部分 | 用绝对值参与运算 |
| 运算方式 | 逐位判断乘数最低位,决定加/不加被乘数 |
| 移位方式 | 部分积右移(逻辑右移) |
| 运算次数 | n 位乘法需要 n 次加法和 n 次移位 |
| 对比项 | 原码一位乘 | 补码一位乘(Booth) |
|---|---|---|
| 参与运算 | 绝对值 | 补码 |
| 符号位 | 单独处理 | 参与运算 |
| 判断依据 | 乘数当前位 | 相邻两位之差 |
| 移位方式 | 逻辑右移 | 算术右移 |
| 最后一步 | 不需修正 | 可能需要修正 |
输入:被乘数 X(n 位)、乘数 Y(n 位);输出:乘积 P(2n 位)。
[部分积 P] [乘数 Y]
↓ ↓
判断Yn → 加X或不加 → P+X 或 P
↓
[P和Y一起右移1位]
↓
[新的P] [新的Y] (Y最后一位移出,P最低位移入Y最高位)
| 步骤 | 乘数Y最低位 | 操作 | 部分积 P | 乘数 Y |
|---|---|---|---|---|
| 初始 | — | — | 00.0000 | 1011 |
| 1 | 1 | P+X | 00.1101 → 右移 00.0110 | 1101 |
| 2 | 1 | P+X | 01.0011 → 右移 00.1001 | 1110 |
| 3 | 0 | P+0 | 00.1001 → 右移 00.0100 | 1111 |
| 4 | 1 | P+X | 01.0001 → 右移 00.1000 | 1111 |
符号位 $0 \oplus 0 = 0$,结果 0.10001111 ✓($0.1101 \times 0.1011 = 0.10001111$)。
$X = 1.1101$(原码),$Y = 0.1011$(原码):数值部分同示例 1 得 0.10001111,符号位 $1 \oplus 0 = 1$,最终 1.10001111(即 -0.10001111)。
| 步骤 | Y最低位 | 操作 | 部分积 P | 乘数 Y |
|---|---|---|---|---|
| 初始 | — | — | 0000 | 0101 |
| 1 | 1 | P+X | 0110 → 右移 0011 | 0010 |
| 2 | 0 | P+0 | 0011 → 右移 0001 | 1001 |
| 3 | 1 | P+X | 1000 → 右移 0100 | 0100 |
| 4 | 0 | P+0 | 0100 → 右移 0010 | 0010 |
结果 0010 0010 = 30 ✓($6 \times 5 = 30$)。
控制逻辑: ┌─────────────────────────────────┐ │ 初始化:P=0, C=n │ │ 循环: │ │ if Yn==1: P = P + X │ │ else: P = P │ │ [P, Y] → 右移1位 │ │ C = C - 1 │ │ if C==0: 结束 │ │ else: 继续循环 │ │ 符号位 = Xs ⊕ Ys │ └─────────────────────────────────┘
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。