快捷搜索: 王者荣耀 脱发

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

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

  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。

········加减交替法 过程与恢复余数法相似,加减交替法是对恢复余数法的改良,优化了余数每次跟除数做完差后判断是否恢复的过程。开始时与原码运算法相同处理,取绝对值,然后第一次被除数对除数做一次差,判断最高位是否溢出,如果第一位商为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. 原码的两种除法过程稍微有一点不同,需要加强记忆,配合逻辑电路图会更好。
经验分享 程序员 微信小程序 职场和发展