Appearance
恢复余数除法
大纲定位
二(二)3 乘/除运算
大纲原文是「乘/除法运算的基本原理,乘法电路和除法电路的基本结构」。恢复余数法是理解加减交替法的台阶,手推一遍即可;真题实际落点在除法器的结构与控制逻辑。
大纲这一条还要求「电路的基本结构」,那部分见 乘法电路与除法电路的基本结构——真题里除法/乘法的综合题考的正是那里。
考情分析
408 的题型只有单项选择题和综合应用题两类。除法在真题中以除法器结构的形式出现——问 R / Q / Y 三个寄存器的初值、计数器在哪个模块、ALU 受控做哪几种运算。手工试减演算是读懂这类题的基础,但卷面上要写的是结构与控制流程。
原码除法的前提
原码除法中,符号和数值分开处理:
- 商的符号 = 被除数符号
除数符号 - 数值部分取绝对值,单独做无符号除法
- 余数的符号与被除数相同
下面讨论的除法过程均针对数值部分(绝对值)。
恢复余数法的基本思想
模拟手工除法的"试减"过程。以定点小数除法为例(
- 首次试减(溢出判断):
,所得符号给出商的整数位 。定点小数除法要求 ,所以 必须为 0(若为 1 说明商 ,溢出)。 不计入小数商位,试减后把余数恢复 - 重复
次,每次得到一个小数商位 : - 余数左移 1 位(等效于引入下一位被除数)
- 试减:用左移后的余数减去除数
- 余数
(够减):该位商 1,保留新余数 - 余数
(不够减):该位商 0,加回除数恢复余数
- 商
最容易错的一步
首次试减只是溢出判断,它产生的是商的整数位
算法伪代码
输入:被除数 |X|,除数 |Y|(定点小数,要求 |X| < |Y|)
初始:余数 R = |X|
R = R - |Y| // 首次试减:溢出判断
if R >= 0: 溢出,停止 // q0 = 1,商 ≥ 1
else: R = R + |Y| // q0 = 0,恢复余数,q0 不计入商
for i = 1 to n:
R = R << 1 // 先左移
R = R - |Y| // 再试减
if R >= 0:
Q[i] = 1 // 够减,商1
else:
Q[i] = 0 // 不够减,商0
R = R + |Y| // 恢复余数
商 = 0.Q[1]Q[2]...Q[n]
最终余数 = R × 2^(-n) // 余数带 2^(-n) 权硬件实现要点
在补码运算器中,"减除数"通过"加除数的补"实现:
判断余数正负只看最高位(符号位):0 为正,1 为负。
算法流程图
交互可视化
例题
例 1:用恢复余数法计算
| 步骤 | 操作 | 余数 | 商位 |
|---|---|---|---|
| 初始 | 0.1011 | ||
| 首次试减 | 1.1110(负) | ||
| 恢复 | 0.1011 | ||
| 左移 | 1.0110 | ||
| 第 1 步 | 0.1001(正) | ||
| 左移 | 1.0010 | ||
| 第 2 步 | 0.0101(正) | ||
| 左移 | 0.1010 | ||
| 第 3 步 | 1.1101(负) | ||
| 恢复 | 0.1010 | ||
| 左移 | 1.0100 | ||
| 第 4 步 | 0.0111(正) |
商
验证:
(真值核对:
例 2:用恢复余数法计算
取绝对值:
被除数用双倍长寄存器对
本例的被除数与除数等长(都是
别把这个条件记成"整数除法都不用试减"
能省首次试减的条件是被除数与除数等长(
如果被除数是
| 步骤 | 左移后 | 试减 | 商位(填入 | 本步结果 |
|---|---|---|---|---|
| 第 1 步 | 0000, 111_ | 0(恢复 | 0000, 1110 | |
| 第 2 步 | 0001, 110_ | 0(恢复 | 0001, 1100 | |
| 第 3 步 | 0011, 100_ | 1(保留) | 0000, 1001 | |
| 第 4 步 | 0001, 001_ | 0(恢复 | 0001, 0010 |
商 = 0010 = 2,余数 = 0001 = 1
验证:
恢复余数法的缺点
| 问题 | 说明 |
|---|---|
| 步骤数不固定 | 每次不够减多做一次加法,最坏情况每步 2 次加法 |
| 控制逻辑复杂 | 需要根据余数符号决定是否恢复 |
| 平均效率低 | 统计上约一半步骤需要恢复 |
这些缺点推动了加减交替法(不恢复余数法)的出现——通过数学推导将恢复操作与下一步的试减合并。
考点清单
- [ ] 恢复余数法三步骤:试减 → 判断符号 → 恢复(若需)→ 左移
- [ ] 原码除法符号位单独处理(异或)
- [ ] 计数口径:上商
次、左移 次(第一次上的商 是溢出判断位,不计入小数商);被除数与除数等长时才可省去首次试减 - [ ] "减除数"通过"加除数的补"实现
- [ ] 最终余数需右移
位还原真实值 - [ ] 恢复余数法缺点:步数不固定、效率低,引出加减交替法