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

原码乘法

重要度 ⭐⭐原码一位乘Booth 算法运算器
速查
核心:逐位判断乘数最低位,1 则 P+X、0 则 P+0,然后 P 和 Y 一起逻辑右移 1 位。符号位单独 $S = X_s \oplus Y_s$,数值用绝对值;n 位乘法需 n 次加法 + n 次移位

核心概念

原码一位乘法是计算机实现乘法运算的基本方法。核心思想是逐位判断乘数,决定是否加被乘数,然后右移部分积

原码乘法的特点

特性说明
符号处理符号位单独计算:$S = X_s \oplus Y_s$(异或)
数值部分绝对值参与运算
运算方式逐位判断乘数最低位,决定加/不加被乘数
移位方式部分积右移(逻辑右移)
运算次数n 位乘法需要 n 次加法和 n 次移位

原码一位乘法 vs 补码一位乘法

对比项原码一位乘补码一位乘(Booth)
参与运算绝对值补码
符号位单独处理参与运算
判断依据乘数当前位相邻两位之差
移位方式逻辑右移算术右移
最后一步不需修正可能需要修正

原码一位乘法算法

输入:被乘数 X(n 位)、乘数 Y(n 位);输出:乘积 P(2n 位)。

初始化

  • 部分积 $P = 0$(n+1 位,含符号位参与运算后的进位)。
  • 乘数 $Y = |Y|$、被乘数 $X = |X|$(取绝对值)。
  • 计数器 $C = n$。

循环(重复 n 次)

  1. 判断乘数 Y 的最低位 $Y_n$:若 $Y_n = 1$:$P = P + X$;若 $Y_n = 0$:$P = P + 0$。
  2. 将 P 和 Y 一起逻辑右移 1 位
  3. 计数器 C 减 1。
  [部分积 P] [乘数 Y]
       ↓         ↓
  判断Yn → 加X或不加 → P+X 或 P
       ↓
  [P和Y一起右移1位]
       ↓
  [新的P] [新的Y]  (Y最后一位移出,P最低位移入Y最高位)

手算示例

示例 1:原码一位乘(正数)$X = 0.1101 \times Y = 0.1011$

步骤乘数Y最低位操作部分积 P乘数 Y
初始00.00001011
11P+X00.1101 → 右移 00.01101101
21P+X01.0011 → 右移 00.10011110
30P+000.1001 → 右移 00.01001111
41P+X01.0001 → 右移 00.10001111

符号位 $0 \oplus 0 = 0$,结果 0.10001111 ✓($0.1101 \times 0.1011 = 0.10001111$)。

示例 2:原码一位乘(含符号位)

$X = 1.1101$(原码),$Y = 0.1011$(原码):数值部分同示例 1 得 0.10001111,符号位 $1 \oplus 0 = 1$,最终 1.10001111(即 -0.10001111)。

示例 3:整数原码一位乘 $X = 0110$(6)× $Y = 0101$(5)

步骤Y最低位操作部分积 P乘数 Y
初始00000101
11P+X0110 → 右移 00110010
20P+00011 → 右移 00011001
31P+X1000 → 右移 01000100
40P+00100 → 右移 00100010

结果 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              │
└─────────────────────────────────┘

常见考法

  1. 手算原码一位乘:给定两个数,逐步写出每步的 P 和 Y。
  2. 判断加法次数和移位次数:n 位乘法需要 n 次加法、n 次移位。
  3. 符号位计算:异或运算。
  4. 与补码乘法对比:算法差异。
  5. 硬件实现分析:需要哪些寄存器和 ALU。

易错点

  • ❌ 部分积右移丢失低位:P 和 Y 要一起右移,P 的最低位移入 Y 的最高位。
  • ❌ 符号位参与运算:原码乘法用绝对值运算,符号位单独处理。
  • ❌ 移位方向:是右移不是左移。
  • ❌ 部分积位数:部分积需要比操作数多 1 位(防止溢出)。
  • ❌ 最后一步需要特殊处理:原码乘法 n 步后直接结束(对比补码 Booth 算法最后一步可能需修正)。
  • ❌ 混淆逻辑右移和算术右移:原码用逻辑右移(补 0),补码用算术右移(补符号位)。

核心结论

  1. 符号单独算:$S = X_s \oplus Y_s$,数值用绝对值。
  2. 判断乘数最低位:1 则加被乘数,0 则不加。
  3. n 位需要 n 次加法 + n 次移位:每步判断 1 位。
  4. 部分积和乘数一起右移:形成一个整体移位寄存器。
  5. 部分积需多 1 位:防止加法溢出。
  6. 验证方法:结果 = 绝对值乘积,符号位异或。

记忆卡片

原码一位乘的符号位怎么计算?
符号位 = Xs ⊕ Ys(异或),数值部分用绝对值参与乘法。同号得正(0),异号得负(1)。
原码一位乘每步做什么?
① 判断乘数最低位 Yn ② 若 $Y_n=1$ 则 P+X,否则 P+0 ③ P 和 Y 一起逻辑右移 1 位
n 位原码一位乘需要多少次加法和移位?
n 次加法(含加 0)和 n 次逻辑右移,总计 2n 步操作。
为什么部分积要比操作数多 1 位?
部分积累加可能产生进位,多 1 位用于容纳进位防止溢出(4 位加 4 位最多产生 5 位结果)。
原码一位乘和补码 Booth 乘法的主要区别?
① 原码用绝对值,Booth 直接用补码 ② 原码判断 1 位,Booth 判断相邻两位之差 ③ 原码符号单独处理,Booth 符号参与 ④ 原码逻辑右移,Booth 算术右移。

交互动画 · 原码一位乘逐步演化

示例 1:X = 0.1101(被乘数绝对值 01101),Y = 0.1011;P 为 5 位部分积(多 1 位防溢出) 被乘数 |X|: 0 1 1 1 1 b4b3b2b1b0 部分积 P: 0 0 0 0 0 乘数 Y: 1 0 1 1 b3b2b1b0(Yn) 判断 Yn = 1 → P + X [P,Y] 逻辑右移 1 位
逐步演示原码一位乘:判断 Yn → 加 X 或不加 → P、Y 一起逻辑右移
点击「第 1 步」开始

相关知识点

twos-complement-multiplication floating-point-add-sub

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