乘法运算
原码的乘法运算
我们小学的时候算两个数相乘是怎么计算的?现在我们先来模拟一下手算乘法:
实际上就是:
0.1011(乘数)=1*2^-1+0*2^-2+1*2^-3+1*2^-4
0.1101(被乘数)=1101*2^-4
0.1101*0.1011=(1101*1*2^-8)+(1101*2^-7)+(1101*2^-6)+(1101*2^-5)
用移位就可以实现
现在我们要考虑如何用机器实现:
- 实际数字有正负号,符号位如何处理?
- 乘积位数扩大一倍,该如何处理?
- 4个位积都要保存下来最后统一相加?
我们带着这几个问题,接着往下面走:
先看一下这个图,后面会用到
首先看一道例题:
ACC全部初始化为0,看MQ的最右边的第一位是1/0,当前位为1则ACC加上被乘数,为0则ACC加上0
丢弃的那一位就不用看了,直接看方格里的,MQ的最右边第一位还是1,则ACC加上被乘数
00110+01101=10011,然后再逻辑右移一位,ACC高位补0
重复上面的过程,MQ的右边第一位是0,则ACC加上0,再逻辑右移一位
MQ的右边是1,则ACC+X;00100+01101=10001,再逻辑右移一位
下一个0了,但这个0不需要参与运算,因为他是乘数的符号位
还需要根据异或的结果来修改这个符号位:这里显示是-1
最后结果就是:1.10001111
到这里ACC为什么叫乘积高位,MQ为什么叫乘积低位相信大家也都理解了
手算模拟
- 乘数的符号位不参与运算,可以省略
- 原码一位乘可以只用单符号位
- 总结:符号位通过异或确定,数值部分通过被乘数和乘数绝对值的n论加法,移位完成,根据当前乘数中参与运算的位确定(ACC)加什么。若当前运算位=1,则(ACC)+[|x|]原;若=0,则(ACC)+0;每轮加法后ACC,MQ的内容统一逻辑右移
补码的乘法运算
首先来看下原码和补码乘法的区别
那么上面说到补码要借助辅助位,那就让我们来看看补码的运算器是怎么样的
手算模拟
除法运算
原码的除法运算
原码的除法运算有恢复余数法和不恢复余数法(加减交替法),这里主要介绍加减交替法
手算除法
如何把这种手算的思想,用手算来实现?
样,符号位用异或单独处理,数值位取绝对值进行除法计算
恢复余数法: (机器)
计算机很傻,会先默认上商1,如果搞错了再改上商0,并恢复余数
默认上商1,用被除数减去除数来判断是否商1是否正确,
ACC-除数转换成:
ACC+[-|y|]补->ACC:01011+10011=11110
当机器检测出ACC的首位是1,也就是负数,发现错误了,应该商0,需要恢复余数,这也就是这个名字的由来
恢复余数:ACC+[|y|补]->ACC :11110+01101=01011
这时需要ACC和MQ中内容逻辑左移(符合手算除法),低位补0
下面就和前面一样,需要先商1,然后相减判断ACC首位是否为1,为1则进行恢复余数,再进行逻辑左移,不为1,则不需要恢复余数,直接逻辑左移就行了.这里就不一一展开了,直接给出最后结果,大家可以去试试
恢复余数法(手算)
每次我们都商1,然后恢复余数,这样显示是很麻烦的,那我们能不能减少操作,不恢复余数囊?
我们接着往下看:
根据上面的分析,当余数为负数时,我们不必要进行恢复余数,上图就是它从a变成了2*a-b;也就是向左移一位然后加上|除数| 。这样我们就引出了加减交替法:
加减交替法:
补码的除法运算(加减交替法)
补码一位除法的特点是,符号位与数值位一起参加运算,商符自然形成.除法第一步根据被除数和除数的符号决定是做加法还是减法;上商的原则根据余数和除数的符号位共同决定,同号上商"1",异号上商"0";最后一步商恒置"1"。
加减交替法的规则如下:
符号位参加运算,除数与被除数均用补码表示,商和余数也用补码表示
若被除数与除数同号,则被除数减去除数;若被除数与除数异号,则被除数加上除数
若余数与除数同号,则商上1,余数左移一位减去除数;若余数与除数异号,则商上0,余数左移一位加上除数
重复执行第3步操作n次
若对商的精度没有特殊要求,则一般采用"末位恒置为1"法