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

不恢复余数除法(加减交替法)

大纲定位

二(二)3 乘/除运算

大纲原文是「乘/除法运算的基本原理,乘法电路和除法电路的基本结构」。加减交替法是实际计算机普遍采用的除法算法(教材原话:恢复余数除法在计算机中很少采用),所以除法器的结构题基本都以它为背景。

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

考情分析

408 的题型只有单项选择题综合应用题两类。真题中除法以除法器结构形式出现(问寄存器初值、计数器位置、ALU 操作种类)。本篇要拿下的是两件事:"余数符号决定下一步做加还是做减"的规则,以及末位余数为负时的修正——后者最容易漏。

从恢复余数法推导

恢复余数法中,当余数 Ri<0 时执行三步操作:

Ri+Y(恢复)左移2(Ri+Y)Y2(Ri+Y)Y=2Ri+Y

如果跳过恢复,直接对负余数左移再加 Y

2Ri+Y

两者结果完全相同。这意味着"不够减"时根本不需要恢复,只需记住下一步改做加法即可。

运算规则

Ri0商 1,Ri+1=2RiYRi<0商 0,Ri+1=2Ri+Y

口诀:余数为正做减法,余数为负做加法。每步固定一次加法或减法,步骤数完全固定。

最终余数修正

若最后一步余数为负(末位商 0),需执行一次修正:

R=Rn+Y

原因:最后一步不够减时,后续没有左移来"消化"这个负余数,所以需要真正恢复一次。

算法流程

输入:被除数 |X|,除数 |Y|(定点小数,要求 |X| < |Y|)
初始:R = |X|,先做一次试减 R = R - |Y|

// 首次试减是溢出判断,产生商的整数位 q0,不计入小数商位
if R >= 0: q0 = 1,溢出,停止
else: q0 = 0,继续(不恢复,下一步按"负余数做加法"规则走)

for i = 1 to n:
    s = sign(R)             // ★ 必须在左移之前记下符号
    R = R << 1              // 左移(左移后符号位会被数值位占用,不可再读)
    if s >= 0:
        R = R - |Y|         // 上一步余数为正 → 减
    else:
        R = R + |Y|         // 上一步余数为负 → 加
    判断 R 正负:正 → Q[i] = 1,负 → Q[i] = 0

商 = 0.Q[1]Q[2]...Q[n]

// 最终修正
if R < 0:
    R = R + |Y|             // 末位商 0 时余数需真正恢复一次

最容易错的一步

与恢复余数法相同:首次试减只是溢出判断(商的整数位 q0),不是第一个小数商位。n 个小数商位都从"左移之后"的加/减开始取。把 q0 当成 q1,整条商会错位一位。

教材差异

有的教材先移位后运算,有的先运算后移位,两者逻辑等价但中间步骤不同。考试时认准一种写法保持一致。

交互可视化

加载可视化中...

例题

例 1:用加减交替法计算 0.1011÷0.1101(正数,4 位数值位)

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

采用先左移后加减的写法(与两本主教材的演算表一致):

看表前先说清一件事

表中的余数是单符号位表示的。左移时符号位会被第一个数值位顶掉——比如 0.1011 左移得 1.0110,看着像负数,其实不是。所以「这一步该加还是该减」永远取决于左移之前那个余数的符号,不能读左移之后的符号位。(若改用双符号位书写,左移按算术左移处理,最高位才是真符号。)

步骤操作余数 R商位
初始0.1011
首次试减RY=0.1011+1.0011=1.11101.1110(负)q0=0(不溢出,不计入商)
左移1.1100
第 1 步上步余数负 → R+Y=1.1100+0.1101=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
左移1.1010
第 4 步上步余数负 → R+Y=1.1010+0.1101=0.01110.0111(正)q4=1

末位余数为正,无需修正。

= 0.1101余数 = 0.0111×24

与恢复余数法结果完全一致,但全程没有做过恢复操作。注意首次试减后余数为负时不恢复,直接左移后按规则做加法——这正是"加减交替"名字的由来。

例 2:用加减交替法计算 X=0.1000Y=0.1011

符号处理:10=1,商为负。

取绝对值 |X|=0.1000|Y|=0.1011[|Y|]=1.0101

步骤操作余数商位
首次试减0.1000+1.0101=1.11011.1101(负)q0=0(不溢出,不计入商)
左移1.1010
第 1 步上步余数负 → R+Y=1.1010+0.1011=0.01010.0101(正)q1=1
左移0.1010
第 2 步上步余数正 → RY=0.1010+1.0101=1.11111.1111(负)q2=0
左移1.1110
第 3 步上步余数负 → R+Y=1.1110+0.1011=0.10010.1001(正)q3=1
左移1.0010
第 4 步上步余数正 → RY=1.0010+1.0101=0.01110.0111(正)q4=1

商的绝对值 = 0.1011,末位余数为正无需修正。

最终:商 = 0.1011(原码 1.1011),余数 = 0.0111×24(余数符号与被除数同号,取负)。

验证:0.10112×0.10112+0.01112×24=121256+7256=128256=0.10002=|X|

与恢复余数法的对比

特性恢复余数法加减交替法
每步操作次数最多 2 次(试减+恢复)恰好 1 次
步骤数不固定固定 n
最终修正不需要末位余数为负时需修正
硬件效率高,实际计算机采用
控制逻辑需要条件分支更规整

补码加减交替法(扩展)

上面讨论的是原码除法。408 偶尔也会涉及补码加减交替法,规则略有不同:

  • 被除数与除数同号:初始做减法
  • 被除数与除数异号:初始做加法
  • 余数与除数同号 → 商 1,下一步做减
  • 余数与除数异号 → 商 0,下一步做加
  • 末位恒置 1(精度损失最大 2n;这是补码加减交替法专属的简化约定,与上文原码除法"末位余数为负才修正"的处理不同,别混用)

补码除法的商直接就是补码表示,不需要单独处理符号。

考点清单

  • [ ] 加减交替法核心规则:正余数下一步减,负余数下一步加
  • [ ] 每步操作固定为一次加/减法
  • [ ] 最终余数为负时需修正 R=R+Y
  • [ ] 与恢复余数法的推导关系:2(R+Y)Y=2R+Y
  • [ ] 原码除法符号位单独处理(异或),余数符号与被除数相同
  • [ ] 步骤数固定为 n(数值位位数),效率优于恢复余数法

真题练习