2019/03/21 08:11
4.2定点数的乘法运算及实现
1)原码的乘法及实现
<1>首先的符号用Ps表示,如果相异则为1,否则反之,符号单独处理;
<2>初始部分的积为0,根据乘数部分来,如果为1那么加上绝对值X,否则加上0;
<3>然后是右移最后把部分积和右移后得到的数结合,符号位看之前的Ps;
<4>最后加完还是要右移;
2)补码的乘法及实现
最后一次不右移
补码校正法:
<1>首先把X、Y都化成补码的形式,然后观察Y的正负,分两种情况。
<2>Y>0,[X]补(0.Y1Y2....)
<3>Y<0,[X]补(0.Y1Y2....)+[-X]补,这里是在最后的时候加上[-X]补;
<4>保存零时累加时,采用两位符号位,且部分积右移时,采用补码的移位规则。
<5>在整个补码乘法中,符号位不是再像原码那样单独处理,而是一起参与运算。
补码Booth算法(比较算法):
<1>运算形式和校正法是一样的;首先把补码[-X]补、[X]补、[Y]补写出来;
<2>在Y中除了符号位也要上去参与比较,还要在末尾加上一个0;
<3>然后开始比较,如果相同的比如是11或是00,加0右移一位,如果是从后往前减大于0,那么加上[X]补,再右移一位;如果是小于0,那么加上[-X]补,再右移一位。
3)原码的除法及实现
左移时采用补码的移位规则,最高符号位不变,最低位补0;且左移的时候包括符号位
原码恢复余数算法:
<1>这里首先有几个比较关键的,一个是Rs(余数的符号位)=Xs,还有就是Qs(商的符号位)为Y、X的结果同号为正0,异号为负1;
<2>开始操作,初始的余数为|X|,且都采用双符号位的办法,商初始都为0,每次都是通过加上[-|Y|]补,如果结果位为符号1,那么不够减,商上0,加上|Y|,恢复,余数左移;如果结果位是0,那么够减商1,余数左移,继续操作,最后一次不左移,但是如果商0,要加上|Y|,恢复余数。
<3>若为定点小数,余数则为计算结果右移n(数值的位数)位的结果;
原码不恢复余数算法(加减交替算法):
<1>其实操作跟上面的方法一致的,但是区别在于,先直接减|Y|,即加上[-|Y|]补,然后如果符号位为0,够减商1,部分余数左移,然后加上[-|Y|]补来求下一部分的余数;如果不够减商0,部分余数左移,加上|Y|来求下一部分余数。
4)补码的除法及实现:
补码不恢复余数算法
先把补码的形式都化出来。
方法一
<1>先判断商符,异号为负即为1,同号为正即为0
<2>然后再是根据符号来进行第一步操作,同号的话第一次操作就是[X]补减法[-Y]补,然后再是余数补码和[Y]补码同号就商1,左移一位再加上[-Y]补,异号就上0,左移一位,再加法[Y]补;如果是异号的话,第一次操作就是加法[Y]补,然后根据余数与Y补码的符号位来判断,同号就是商1,再减法[-Y]补,异号就商0,再加法[Y]补。
<3>最后一位就是恒置1。
方法二
<1>直接是就是把[X]补当成余数来处理,同号商1,左移一位,再减去即加上[-Y]补;
异号商0,左移一位,加上[Y]补;
<2>最后一位恒置1。
<3>最后完成时记得,把符号位取反。