原码除法
计算机原码除法主要分为恢复余数法和加减交替法,我们先从十进制除法运算中获取一些规律,再运用到二进制的除法运算中.
十进制除法
仔细观察下面十进制运算782/7的过程.
782除以7第一位商上1,余数为0.第二位上1,余数为1,1和2又组合成新的余数.第三位还是上1,余数为5.结果商便为111.
我们可以得出以下规律
- 每一次上的商乘以除数要无限接近于被除数但又要比它小
- 上完商之后要用被除数减去商乘以除数的结果算出余数
- 减出余数后要把被除数后一位和余数结合形成新的余数进行下一轮计算
我们现在可以把这些规律应用到原码的除法当中去.
恢复余数法
如题:假设计算机字长为5位,x=0.1011,y=0.1101.请采用恢复余数法计算出x/y的结果?
计算结果如下图,接下来分析其计算过程:
x=0.1011,y=0.1101.可以得出|x|=0.1011,|y|=0.1101,|y(补)|=0.1101,|-y(补)|=1.0011.
为了计算x/y的商,可以分成2步来进行运算.第一步算出符号位.将x的符号位与y的符号位进行异或运算,得出商的符号位.第二步计算出|x|/|y|的值.
- |x|/|y|,第一步默认商上1,计算过程为|x|-1*|y|,相当于|x|+|-y(补)|=1.1110.最后发现最高位为1(1代表负数),违背了上面总结的十进制除法的第一条规律.因此商不应该上1,而是0.所以得把结果还原,还原的方式就是加上一个|y(补)|即可.
- 通过上述第一步运算确定了商第一个数为0,现在进行第二轮运算,要将余数左移一位,最高位舍弃.第二位继续默认商上1.用余数加上|-y(补)|得到的结果为0.1001,发现最高位是0.说明此次上1是正确的结果.
- 依次类推直至最后算出商为0.0111,余数为01101(机器字长最大为5位)
加减交替法
减价交替法和恢复余数法的计算过程一样,不过是在其基础上进行了改良,使计算过程更加快捷.
在恢复余数法的计算过程中,商默认上1,得到的余数发现如果是负数需要再加上|y(补)|进行数据还原,这个过程可以优化一下.
假设商上1.|x|+|-y(补)|的结果为负数记为a.需要再加上y(补)|变成了a+|y(补)|,向左移动一位,既(a+|y(补)|)*2.随后进行下一轮运算时又要减去|y(补)|,计算过程就变成了(a+|y(补)|)*2-|y(补)|=a*2+|y(补)|
总结而言当发现上完商后得到的余数如果是负数,就把该数左移一位并加上|y(补)|就可进入下一轮运算.详细计算过程如下图: