直接补码并行乘法
首先,回顾一下绝对值乘法中的阵列乘法,其中的两个输入|a|、|b|已知,求出结果|p|。如果我们的两个输入分别是[a]补、[b]补,那么结果是什么?
[a]补 * [b]补 。。。好吧,什么都不是,只是个赤裸裸的结果罢了。
但是这么引入必有其意义所在,首先我们利用完绝对值乘法求完|ab|之后,可以通过a、b的符号位得到ab的值,这时候就需要观察a、b的最高位的符号了,详细的内容就翻之前的文章就是了。
那么我们一直[a]补、[b]补,要求ab,更快捷的方法就是直接补码并行乘法(直接补码阵列乘)。
如果利用[a]补和[b]补参与阵列乘,那和之前的绝对值乘法没有什么区别,但是我们在求ab的话就需要做出修改,这利用的就是a和[a]补的关系了,具体的推导就不写了,直接给出结论:
已知:
则:
那么ab展开式就为:
而本来[a]补[b]补的结果为:
[a]补*[b]补的阵列乘是我们之前接触过的朴素的阵列乘,那么
最后可以得到ab的阵列乘的图为:
观察ab的式子,“-”出现的位置必然是包括an和bn的(除了anbn),也就是这个阵列乘图的a4和b4(除了anbn)。
因此在阵列乘中,有部分地方的全加器并不是之前的朴素版本的,我们记原先的朴素全加器(三个正数相加得到两个正数)为0类全加器,引入1类全加器和2类全加器。各有如下特点:
(1)1类全加器:
如图所示,3个输入中有一个数会先进行取负数操作(z端)两个输出中s端之后是取负数的操作。这一点怎么理解?
我们在二进制中,一个极限的加法是z为1,x、y都为0,那么结果是-1,只需要s为1即可,也就是说根本不需要高位去对此产生什么借位,本位就够用了。
为了让大家更好理解体会,再取一个例子,输入中负端为0,正端中一个为1一个为0,那么加完的结果本该为1,这个1有点尴尬,放在S端不就是-1了?放在C不就是2了?那么结果就直接为C=1、S=1,刚好的结果就是1。
真值表如下:
(2)二类全加器
结构就不讲了,直接讲讲为啥是C之后有个取反符号,取最极端的结果,X=1、Y=1、Z=0,只有消耗没有产出,那么仅仅靠着本位S是无法配平的,必须要C为1时,高位的1永远是低位的1的权值的2倍,那么这样的情况下,C=1,S=0。
别的例子不列举了,按着这个思维就不会错。
真值表如下:
顺便讲讲3类全加器,读者可以按照这种逻辑自行推导:
那么回到直接补码阵列乘,就很好理解1类全加器的作用了,而二类全加器,在这里有两处作用:
(1)1类全加器的本位和求得之后是取反的,当遇到一些地方,另外一个加数包含了b4/a4的时候,就会使得两个输入之后会进行取反。因此会需要2类全加器。
(2)在p5那一列的最后一个全加器那里,观察0,既可以当成正数,也可以当成负数。如果当成正数,那就错啦!因为这样的话就成为了1类全加器,使得本位和取反后可能为-1,不符合题目的要求了。因此2类全加器还还起了这么一个作用。
那么你可能会问了,那p9那一位(即最左边的全加器的进位端)变成负数了咋办?甭管他,为1就是1,为0就是0,这就是答案,不要在那里再一次取反了(就是看图,最高位可并没有小圆圈表示取反)。为1代表该全加器有借位,为0代表该全加器无借位。而全加器有借位的话,就是负数了,因此p9刚好也就是二进制的符号位。
补码乘法运算(部分积形式)
先引入这么一个问题,已知[X]补=Xn Xn-1 Xn-2…X0、[Y]补=Yn Yn-1 Yn-2…Y0,求XY。(别管X是正号还是负号,是负号的话在部分积+移位的方法里面直接取其补码就好了(结果也会是补码),讨论X的正负并不会影响下面的结果)
(1)若Yn=0,则XY=[X]补*[Y]补
(2)若Yn=1:
那么Yn就相当于Yn-1 Yn-2…Y0 - Yn2^n
则[X]补[Y]补的其中最高一次相乘就是-[X]补
又因为**[-X]补=-[X]补=[X]求补**,因此最后的公式为
XY=[X]补Yn-1 Yn-2…Y0+[-X]补*1
移位时,部分积高位为0则补0;部分积高位为1则补1,因为总不可能补位完符号变了吧,其实正好也符合了补码的伸展缩减原则哦,原先符号位是1(负数)的情况下补多少个1都没关系
实际上,情况1的情况可以和情况2合并,即XY=[X]补Yn-1 Yn-2…Y0+[-X]补0
上述的方法进行总结,也就是XY=[X]补Yn-1 Yn-2…Y0+[-X]补Yn。
也许这时候你还是有点懵逼,给一道例题:求-2*-3的部分积+移位的全过程
详细解答:
上面的-[X]补就是+[-X]补,也可以看做是[X]求补。
booth乘法原则
注意:下面的原理部分内容我认为最好是能自己理解一下精髓,实在理解不了就看一道例题再回来理解一下精髓
[乘数]补低位添加补0参考判断:
00原部分积+0,右移一位
01原部分积+[被乘数]补,右移一位
10原部分积+[-被乘数]补,右移一位
11原部分积+0,右移一位
初始状态,部分积全0
移位时,部分积高位是0则补0,否则补1
booth乘法原则是不是看得你一愣一愣的,先自己再琢磨一下其中的思维。
公式推导一下:
其中Y-1为0,这是为了单独再配出一个道来补齐这个式子,而在部分积+移位的步骤里就体现在在乘数背后加个0。
这下总能理解为啥尾数是01的时候,是+X补;尾数是10的时候,是-X补了吧。
例如:-2*-3,利用booth乘法:
希望大家能理解,不能理解请先思考一个问题,[X]求补的精髓,[X]求补可不是单单一个“从右往左找到第一个1,包括这个1在内的右边部分保持,左边按位取反”这么简单。包括求补码的第二种方式,也需要理解一下为什么在进行求补之前要取绝对值?请先思考,如果思考不出来直接在评论区问吧!
booth乘法其实没有什么太大的作用,只不过比较校正法,booth乘法很固定,就是看尾数,而校正法就是中规中矩,除了最后一位是-X补以外。
再讲一下快速乘法,懒得自己推了,就是式子写两层,低层带到高层而已:
因此可以类比一下booth乘法,得出一个结论:
理解完booth,在这个总能理解吧?理解不了就是你booth没理解,自己再去理解一下。
显而易见的提高了效率,每次都能处理两位。
那这还是最简单情况的快速乘法,这种公式当然可以推导出3位的快速乘。