最近几天复习计组的Booth算法,发现很多课程的讲解都有些不到位的地方,本人也是综合了很多课程的讲解以及他们对于Booth算法的运用来讲解Booth算法,我也希望通过我的讲解能带你一次性掌握Booth算法的应用。(注意:这里针对于期末考试做题,并不深究算法的理解)
一、例题
话不多说,直接上例题,书本和老师的一些理论介绍总是很让人心生困意,直接跟本人一起来做题提提神。
例: X = -0.1101 , Y = 0.1011。求 X * Y。
1.Booth算法是对于补码的计算,首先先将以上两个数字转化为补码的形式,并且计算X相反数的补码(我知道你不知道为啥要算相反数,但你先别急先算),利用公式-X = ~X + 1(这个公式由X + ~X = -1 推导过来,很好理解,一个数的原码加反码就是全是1,比如1101 + 0010 = 1111 = -1)
得: [X]补 = 1.0011, [Y]补 = 0.1011,[-X]补 = 0.1101
2.我们知道以上标红的数字位为符号位,即表示正负的flag,1为负,0为正。然后我们将符号位扩展为双符号位,让11表示正,00表示负。
得: [X]补 = 11.0011, [Y]补 = 00.1011,[-X]补 = 00.1101
3.我们到目前为止还没进行运算,刚刚做好了准备工作,所以此时的乘积还没开始计算,对于计算机来说此时的结果res = 00.0000。
4.我们以前手算比如20 * 11,实际上后来算的是分部计算各部分乘积后的加法:020 + 200 = 220。如图:
Booth算法也是通过部分的计算再累加成最终结果的。
5.开始计算,首先给乘数(Y)一个辅助数0添加到末位:Y = 00.10110。从现在开始每次取乘数的从左往右最后两位,现在为第一次所以取10。我们知道首位是符号位,因为首位是1,所以这里表示减(这句话是方便大家记忆的,并非真正的原理,别的版本的理解很多,我觉得这样最好记)
也就是计算机读取到这两位之后自动识别出“减”的意思,则执行“减”的操作,所以此时将res 减被乘数的补码,也就是res 加被乘数相反数的补码(提前算出来过),这里就是res = res + 00.1101。
---> res = 00.1101
然后乘数Y抛弃一位得到00.1011,抛弃一个末位0。而res要右移一位(注意不是被乘数X右移,X是不动的),抛出一个末位的1(这里使用了不同的词,抛弃就是不用管了,抛出就是还要存着)。
---> res = 00.0110 Y = 00.1011(这里比res还多一位就是因为之前补过一个0)
--->thrown = 1
以上5的全过程就是一个循环。中间有一个判断就是乘数Y的末位。
6.再进入循环,判断此时Y的末位为11,Booth算法中如果末位为11或00的成对的数字,那么则直接进行移位,因为res = res + 0。(刚刚的10表示“减”,所以01表示“加”)
--->res = 00.0011(抛出0) Y = 00.101 thrown = 01
7.依次循环到最后依次可得:thrown = 0001 Y = 00.1 res = 00.0100,此时进行最后一次循环,不用管小数点,过了小数点也就表示最后一次循环了, 此时末位为01,所以进行加运算,那么就是res = res + [X]补 = 00.0100 + 11.0011 = 11.0111。最后一次循环不进行移位操作!
8. 最终的结果就是res的值后面补上res抛出过的部分即thrown,即res = 11.01110001(标红的是thrown部分)
9.将双符号位改回带单符号位,所以[X * Y]补 = 1.01110001,所以X * Y = 0.10001111。
以上就是Booth算法的全过程了。
二、计算过程展示
三、提醒
另外我还要提醒一下,小数点只是约定好的位置,并不影响计算,比如你取反加1的时候加的1直接加到末位就行了而不是在小数点之前加1。
并且把res抛出的数添加到thrown是在左边添加!
那么以上就是我对于Booth算法的讲解了,希望你能够通过仅此一篇就能够掌握Booth算法的运算!