精简版 · 小杯2026-08 冻结,已停止更新(发布前修订了 4 处已知错误)。后续勘误与新增内容只在正式版。看正式版(中杯)→
Skip to content

恢复余数除法

大纲定位

二(二)3 乘/除运算

大纲原文是「乘/除法运算的基本原理,乘法电路和除法电路的基本结构」。恢复余数法是理解加减交替法的台阶,手推一遍即可;真题实际落点在除法器的结构与控制逻辑。

大纲这一条还要求「电路的基本结构」,那部分见 乘法电路与除法电路的基本结构——真题里除法/乘法的综合题考的正是那里。

考情分析

408 的题型只有单项选择题综合应用题两类。除法在真题中以除法器结构的形式出现——问 R / Q / Y 三个寄存器的初值、计数器在哪个模块、ALU 受控做哪几种运算。手工试减演算是读懂这类题的基础,但卷面上要写的是结构与控制流程。

原码除法的前提

原码除法中,符号和数值分开处理:

  • 商的符号 = 被除数符号 除数符号
  • 数值部分取绝对值,单独做无符号除法
  • 余数的符号与被除数相同

下面讨论的除法过程均针对数值部分(绝对值)。

恢复余数法的基本思想

模拟手工除法的"试减"过程。以定点小数除法为例(n = 数值位位数):

  1. 首次试减(溢出判断)RY,所得符号给出商的整数位 q0。定点小数除法要求 |X|<|Y|,所以 q0 必须为 0(若为 1 说明商 1,溢出)。q0 不计入小数商位,试减后把余数恢复
  2. 重复 n 次,每次得到一个小数商位 qi
    • 余数左移 1 位(等效于引入下一位被除数)
    • 试减:用左移后的余数减去除数
    • 余数 0(够减):该位商 1,保留新余数
    • 余数 <0(不够减):该位商 0,加回除数恢复余数
  3. =0.q1q2qn

最容易错的一步

首次试减只是溢出判断,它产生的是商的整数位 q0,不是第一个小数商位。真正的小数商位都从"左移之后"的试减开始。把 q0 当成 q1,整条商会错位一位(恰好小一倍)。

算法伪代码

输入:被除数 |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) 权

硬件实现要点

在补码运算器中,"减除数"通过"加除数的补"实现:

R|Y|R+[|Y|]

判断余数正负只看最高位(符号位):0 为正,1 为负。

算法流程图

交互可视化

加载可视化中...

例题

例 1:用恢复余数法计算 0.1011÷0.1101(正数,4 位数值位)

|X|=0.1011|Y|=0.1101[|Y|]=1.0011

步骤操作余数 R商位
初始0.1011
首次试减RY=0.1011+1.0011=1.11101.1110(负)q0=0(不溢出,不计入商)
恢复R+Y=1.1110+0.1101=0.10110.1011
左移1.0110
第 1 步RY=1.0110+1.0011=0.10010.1001(正)q1=1
左移1.0010
第 2 步RY=1.0010+1.0011=0.01010.0101(正)q2=1
左移0.1010
第 3 步RY=0.1010+1.0011=1.11011.1101(负)q3=0
恢复R+Y=1.1101+0.1101=0.10100.1010
左移1.0100
第 4 步RY=1.0100+1.0011=0.01110.0111(正)q4=1

Q=0.1101余数 =0.0111×24

验证:0.11012×0.11012+0.01112×24=0.101010012+0.000001112=0.101100002=0.10112,与被除数完全相等,结果正确。

(真值核对:0.6875÷0.81250.846,商 0.11012=0.8125 为其 4 位截断 ✓)

例 2:用恢复余数法计算 X=+7Y=+3,机器字长 5 位(含符号位)

取绝对值:|X|=0111|Y|=0011

被除数用双倍长寄存器对 (R, Q) 存放:余数寄存器 R=0000,低位 Q=0111。每步先把 (R,Q) 整体左移 1 位(被除数最高位移入 RQ 末位空出),再对 R 试减,商位填入 Q 空出的末位。

本例的被除数与除数等长(都是 n 位,R 初值为全 0),此时商必定不超过 n 位,所以可以省去首次试减,直接走 n 步。

别把这个条件记成"整数除法都不用试减"

能省首次试减的条件是被除数与除数等长n÷n),不是"只要是整数除法"。

如果被除数是 2n 位(双精度除法,R 初值装的是被除数高 n 位),首次试减就是唯一的溢出判据,绝不能省。举个反例:48÷2n=4——首次试减 RY0 说明商会超过 4 位、已溢出;若跳过这一步硬走 4 步,会得到商 15 余 18 这种荒谬结果(真值是商 24 余 0)。

步骤左移后 (R, Q)试减 RY商位(填入 Q 末位)本步结果 (R, Q)
第 1 步0000, 111_00000011(负)0(恢复 R0000, 1110
第 2 步0001, 110_00010011(负)0(恢复 R0001, 1100
第 3 步0011, 100_00110011=0000(正)1(保留)0000, 1001
第 4 步0001, 001_00010011(负)0(恢复 R0001, 0010

商 = Q = 0010 = 2,余数 = R = 0001 = 1

验证:7÷3=21,正确。

恢复余数法的缺点

问题说明
步骤数不固定每次不够减多做一次加法,最坏情况每步 2 次加法
控制逻辑复杂需要根据余数符号决定是否恢复
平均效率低统计上约一半步骤需要恢复

这些缺点推动了加减交替法(不恢复余数法)的出现——通过数学推导将恢复操作与下一步的试减合并。

考点清单

  • [ ] 恢复余数法三步骤:试减 → 判断符号 → 恢复(若需)→ 左移
  • [ ] 原码除法符号位单独处理(异或)
  • [ ] 计数口径:上商 n+1 次、左移 n(第一次上的商 q0 是溢出判断位,不计入小数商);被除数与除数等长时才可省去首次试减
  • [ ] "减除数"通过"加除数的补"实现
  • [ ] 最终余数需右移 n 位还原真实值
  • [ ] 恢复余数法缺点:步数不固定、效率低,引出加减交替法

真题练习