前言
在学习定点数的原码一位乘法之前,我们要知道我们在学的是什么,定点数的原码乘法其实完全用十进制的乘法规则来计算,只需要将逢十进一改为逢二进一即可:
既然我们都知道定点数的原码乘法了,我们为什么还要学习原码一位乘法?其实定点原码一位乘法是计算机硬件实现定点数乘法的运算规则。如果不深究原理只需要会做题的话可以直接跳转至下文方法部分。
原理
我们先来看手算二进制是怎样实现的,然后用计算机去一步一步的实现:
我们可以看到,本质上其实还是四位乘数分别与被乘数相乘,然后错位相加,
在手算的时候,我们可以手写错位,那么在计算机该如何实现错位相加呢?此时我们回想前面学习到的移位操作显然算数右移可以帮助我们解决这个问题;
观察右边错位相加可以发现,第一个值0.00001101可以通过被乘数0.1101右移四位得到,下面第二个值0.0001101可以通过被乘数右移三次得到,依次递减;那么我们可以先分别把这四个要相加的数右移变换之后再相加,这样需要右移4+3+2+1=10次,显然有点多,那么我们假设相加结果初值是0,我们如果加一步右移一步,先将0与第一个0.1101相加再右移,然后再将得到的结果0.01101与第二个0.1101相加再右移,得到结果0.100111以此类推,这样第一个0.1101任然达到右移四次的效果,第二个0.1101任然达到右移三次的效果,然而整个运算过程却只需要右移四次就行了。
我们来看硬件实现:
开始时累加器ACC放初始值0;MQ放乘数0.1101;X放被乘数0.1101
① 乘数最低位是1,初始值+(1×0.1101),然后右移,进行下一位运算;
② 乘数最低位是1,暂时结果(也就是红色数据)+(1×0.1101),然后右移,进行下一位运算;
③ 乘数最低位是0,暂时结果(也就是红色数据)+(0×0.1101),然后右移,进行下一位运算;
④ 乘数最低位是1,暂时结果(也就是红色数据)+(1×0.1101),然后右移,进行下一位运算;
⑤ 符号位不参与运算,单独计算符号位,得出结果:
上述例子是两个正数的乘法,如果是负数的乘法,符号位单独运算,数值用绝对值去计算。
方法
方法其实很简单,只要记住三点就行:
- 符号位单独运算,出现负数用绝对值计算;
- 先加后移位;
- 数值有几位(n)就移位几次(n次)。