原码的乘法、除法运算

乘法:

原码一位乘法:


结果符号的确定:符号位异或,很好理解
数值位绝对值相乘
小数的乘法:


小学乘法的规则是:乘数的每一位和被乘数进行相乘,然后作为数积,
然后,乘数的次高位和被乘数再计算得出相应的数积,但是需要左移一位;
以此类推。。。
最后是将之不同的数积,对应不同的位,进行累加。
所以机器可以模拟这个过程:
在乘数最低位和被乘数计算得出数积的时候,就可以直接和0进行累加得出阶段累加结果;
然后阶段累加结果和乘数都向右移动一位,然后再将次低位和被乘数相乘得到对应数积,然后再累加
这样就保证了数积对齐的问题
同时,还解决了乘数进行数积计算的问题,因为每一次右移,我们就只需要拿最低位的数进行计算就完事。
最后,如果是n位之间的乘计算,那就进行移位和数积计算n次即可

除法:


手算整数的除法:


将除数的小数点移动到最右边,被除数跟着移动。
之后,对于每一次的余数,减去,用除数乘以商的积,要保证每一次的积尽可能的接近余数,但是又不能大于被除数
如此循环,直到最后的余数为0


手算二进制的除法:


和整数的除法是一样的
只是多了一个区别,那就是商只能取0或者1
所以,就不需要考虑商和除数的积是否尽可能接近被除数的情况
因为就只有商的可能取值:要么0,要么1
所以,相对更加简单


用机器实现除法:

方法一:恢复余数法

因为所有正负整数、正负小数都可以转化为二进制,所以机器只需要解决二进制的除法计算,就可以解决所有数据的计算
所以需要处理二进制的除法计算
机器处理二进制需要是四个期间:
ACC:存储被除数和余数
通用寄存器:存余数
ALU:进行计算,从ACC拿到余数/被除数和余数,进行减法运算
MQ:存商

四个器件的处理过程如下:
将被除数存到ACC中,除数存到通用寄存器中
然后在MQ的最低位默认为当前计算的商(注意,默认为1)
然后,取商1,和通用寄存器的除数相乘,得到积,传给ALU
ACC将被除数传到ALU
ALU对被除数和商*除数的积进行相减
得到结果再返回给ACC
ACC再判断减的结果如果是负数,说明商应该为0
于是,传信息给MQ,将商从1改为0
同时,余数也要恢复
于是,ACC再将这个负数的余数传到ALU,通用寄存器也把除数再次传到ALU,二者相加
回复到原来没有被减去除数的要被除数/余数
之后,整个ACC和MQ向左移动一位
于是,ACC更新为新的余数,MQ更新为新的商结果
持续以上的处理循环,当ACC的余数部分为0时,计算结束
或者当达到计算精度要求时,计算结束

第二种方法:加减交替法

该方法是方法一的改进
方法一的商默认为1,当商应该为0时,需要对当前的余数加上除数恢复到原来的余数这样的一个处理
所以,比较麻烦,还需要再回去一次
那么,是不是可以改进这一点呢?
可以

假设当前余数为a
除数为b
恢复的处理是:a + b 
也就是说,原来的余数应该是a + b
然后商恢复为0
再进行下一位的计算
左移:2(a+b)
商设置为1,再减去b除数
得到下一个位置的余数:2(a+b)-b=2a+b

有了以上的推理,我们就可以实现:
当余数为负数时,
1、调整当前商为0
2、调整下一个位置的商为1
3、全部左移一位
4、当前余数直接*2 + 除数 ,直接得到下一步计算的余数
一箭三雕,得到了当前位的商0,得到下一个位置的商,得到下一个位的余数
妙哉


但是这里有一个问题:
如果是定点小数的除法,结果也只能是定点小数,也就是不能表示大于1的数
也就是说,被除数必须比除数小
那么,机器是怎么检测的呢?
很简单,
如果商的第一位是1,那就说明被除数比除数大,直接中断计算


 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
(1)用[X]补×[Y]补直接求[X×Y]补 讨论当相乘的两个数中有一个或二个为负数的情况,在讨论补码乘法运算时,对被乘数或部分积的处理上与原码乘法有某些类似,差别仅表现在被乘数和部分积的符号位要和数值一起参加运算。 若[Y]补=Y0Y1Y2…Yn 当Y0为1时,则有Y=-1+Yi×2-i 故有 X×Y=X×Yi×2-1-X当Y为负值时,用补码乘计算[X×Y]补,是用[X]补乘上[Y]补的数值位,而不理[Y]补符号位上的1,乘完之后,在所得的乘积中再减X,即加-[X]补。实现补码乘法的另一个方案是比较法,是由BOOTH最早提出的,这一方法的出发点是避免区分乘数符号的正负,而且让乘数符号位也参加运算。技巧上表现在分解乘数的每一位上的1为高一位的一个+1和本位上的一个-1:X×Y=X×(-1+Yi×2i) (逐项展开则得)=X×[-Y0+Y1×2-1+Y2×2-2+…+Yn×2-n]=X×[-Y0+(Y1-Y1×2-1)+(Y2×2-1-Y2×2-2)+…+(Yn×2-(n-1)-Yn×2-n)](合并相同幂次项得) =X×[(Y1-Y0)+(Y2-Y1) ×2-1+…+(Yn-Yn-1) ×2-(n-1)+(0-Yn) ×2-n]=X×(Yi+1-Yi)×2-i(写成累加求和的形式,得到实现补码乘运算的算法)将上述公式展开,则每一次的部分积为: P1=[2-1(Yn+1-Yn) ×X]补 P2=[2-1(P1+(Yn-Yn-1) ×X)]补 … Pi=[2-1(Pn-i+(Yn-I+2-Yn-I+1) ×X)]补 … Pn=[2-1(Pn-1+(Y2-Y1) ×X)]补 Pn+1=[ (Pn+(Y1-Y0) ×X)]补 则最终补码乘积为[X*Y]补=[Pn+1]补 由上述公式可以看出,比较法是用乘数中每相邻的两位判断如何求得每次的相加数。每两位Yi和Yi+1的取值有00,01,10,11四种组合,则它们的差值分别为0,1,-1和0,非最后一次的部分积,分别为上一次部分积的1/2(右移一位)的值Rj,Rj+[X]补,Rj-[X]补(即Rj+[-X]补)和Rj,但一定要注意:最后一次求出的部分积即为最终乘积,不执行右移操作。用此法计算乘积,需要乘数寄存器的最低一位之后再补充一位Yn+1,并使其初值为0,再增加对Yn和Yn+1两位进行译码的线路,以区分出Yn+1-Yn 4种不同的差值。对N位的数(不含符号位)相乘,要计算N+1次部分积,并且不对最后一次部分积执行右移操作。此时的加法器最好采用双符号位方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二十5画生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值