计组第九课

直接补码并行乘法
首先,回顾一下绝对值乘法中的阵列乘法,其中的两个输入|a|、|b|已知,求出结果|p|。如果我们的两个输入分别是[a]补、[b]补,那么结果是什么?
[a]补 * [b]补 。。。好吧,什么都不是,只是个赤裸裸的结果罢了。

但是这么引入必有其意义所在,首先我们利用完绝对值乘法求完|ab|之后,可以通过a、b的符号位得到ab的值,这时候就需要观察a、b的最高位的符号了,详细的内容就翻之前的文章就是了。

那么我们一直[a]补、[b]补,要求ab,更快捷的方法就是直接补码并行乘法(直接补码阵列乘)。
如果利用[a]补和[b]补参与阵列乘,那和之前的绝对值乘法没有什么区别,但是我们在求a
b的话就需要做出修改,这利用的就是a和[a]补的关系了,具体的推导就不写了,直接给出结论:
已知:在这里插入图片描述
则:
在这里插入图片描述
那么ab展开式就为:
在这里插入图片描述
而本来[a]补
[b]补的结果为:
在这里插入图片描述
[a]补*[b]补的阵列乘是我们之前接触过的朴素的阵列乘,那么
最后可以得到ab的阵列乘的图为:
在这里插入图片描述
观察a
b的式子,“-”出现的位置必然是包括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,则X
Y=[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
上述的方法进行总结,也就是X
Y=[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位的快速乘。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

布布要成为最负责的男人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值