原码的恢复余数除法和加减交替除法

原码的除法分讲两种,一种是恢复余数法,一种是加减交替法

  1. 恢复余数法
    过程为:
    ① 对被除数和除数取绝对值,先做被除数-除数。
    ② 判断余数是否小于0,若是,则加上除数的补,否则减去除数的补
    ③ 移位,重复步骤② 直到移位次数等于除数的位数,上商的次数为移位次数+1。

直接上题:
x=-0.1011, y=-0.1101, 求[x/y]原。
解:
① 先求绝对值,x_=0.1011, y_=0.1101,y_求补=1.0011。
② 被除数-除数,0.1011+1.0011=1.1110。
③ 余数小于0,上商0,余数加上除数来恢复余数,1.1110+0.1101=0.1011,往左移位,第一次移位得到余数=1.0110,商=0
④ 余数-除数,1.0110+1.0011=0.1001,余数大于零,此时上1,不用恢复余数移位,第二次移位得到余数=1.0010,商=01
⑤ 重复步骤④,1.0010+1.0011=0.0101,余数大于零,上1,不恢复余数移位,第三次移位得到余数0.1010,商011
⑥ 重复步骤④,0.1010+1.0011=1.1101,余数小于零,上0,恢复余数移位,1.1101+0.1101=0.1010,第四次移位得到余数=1.0100,商0110
⑦ 重复步骤④,1.0100+1.0011=0.0111,余数大于零,上1,不移位,得到最终商0.1101。
⑧ 取结果,舍去最高位商0,得到1101,结果符号判断,被除数和除数符号相同,取0,因此结果为0.1101。
原理总结:我们可以把每一步中的减去除数当作过程1,把判断余数是否需要恢复和上商作为另外一个过程2。开始除法时,原码的计算是要求绝对值的,符号位另外处理,直接进行过程1,先减去除数;随后进行过程2,判断余数是否小于零,如果是,则先上商0,恢复余数后再移位,如果余数不小于零,则上商1,不恢复余数经行移位。移位完毕后,重复过程1和过程2,直到移位次数位除数的尾数位数,最后一步还要上一次商。

注意事项:

  1. 原码的所有计算符号位都取一位,计算开始之前取绝对值,符号位单独处理。
  2. 移位过程中采用补码的逻辑移位,即最高位也进行移位,末尾补0。
  3. 上商的次数一定是移位次数+1,且取结果时要丢掉最高位0;这里要讲的是,任何能进行的除法第一位一定是0,否则当作溢出处理,不进行除法。

········加减交替法
过程与恢复余数法相似,加减交替法是对恢复余数法的改良,优化了余数每次跟除数做完差后判断是否恢复的过程。开始时与原码运算法相同处理,取绝对值,然后第一次被除数对除数做一次差,判断最高位是否溢出,如果第一位商为0,则继续下去。移位后的处理由上一次的商决定,如果上一次商0,则对余数进行左移后-除数;若上一次商为1,则对余数左移后+除数。移位次数等于除数的尾数位数,上商次数为移位次数+1。

拿上述的题作为例子:
x=-0.1011, y=-0.1101, 求[x/y]原。
解:
① 被除数和除数求绝对值,的x_=0.1011, y_=0.1101,y_求补=1.0011,第一步进行被除数-除数,即0.1011+1.0011=1.1110,小于0,上商0,继续除法。
② 第一次上商0,余数左移后+除数,即1.1100+0.1101=0.1001,余数大于0,上商1,得到商01。
③ 上一次上商1,余数左移后-除数,即1.0010+1.0011=0.0101,余数大于0,上商1,得到商011。
④ 上一次上商1,余数左移后-除数,即0.1010+1.0011=1.1101,余数小于0,上商0,得到商0110。
⑤ 上一次上商0,余数左移后+除数,即1.1010+0.1101=0.0111,余数大于0,上商1,得到商01101。
⑥ 取结果,合掉商的最高位,符号位为被除数和除数符号位异或,得0.1101。

两种除法的总结:

  1. 所有的原码计算均先取绝对值,乘法和除法都是取1位符号位。
  2. 符号位单独处理。
  3. 原码的移位规则都是逻辑移位,不是算术移位。
  4. 余数每次做加减的对象是除数,不要搞错了。
  5. 原码的两种除法过程稍微有一点不同,需要加强记忆,配合逻辑电路图会更好。

猜你喜欢

转载自blog.csdn.net/CaiYuxingzzz/article/details/104973268