关于Booth算法是什么,以及怎么用,可以参考以下这篇文章。本文的重心在于解释为什么Booth算法是对的,它的原理是什么。注意,本文不涉及数学推导,但是需要熟悉在计算机组成原理中的乘法运算。
https://blog.csdn.net/qq_44840079/article/details/104790338
(PS:本文创作的初心是因为发现没有在CSDN和B站上找到快速讲懂该问题的文章和视频,推导的原理纯粹是本人中午没睡着,突然想明白的)
————————
正文开始:
7 X 3
= 0111 X 0011
= 0111 X (0100 - 0001)
= 0111 X 0100 - (0111 X 0001)
= 0111 X 0100 + 1001 X 0001 (这里变换的原因是将 -0111 通过补码 写成了 1001)
我们从这里就能看到为什么Booth算法中一会要加被乘数(7)的原码,一会要加被乘数的补码了。因为我们用减法的方式表示了乘数(即 3 = 4 - 1)。
所以其实我们的问题回到,什么时候要加原码,什么时候要加补码。
我们从0111 X 0100 + 1001 X 0001 可以知道应该在乘数(3)的第零位(从右往左)加反码,在第二位加原码。那么我们怎么从3的二进制表示0011知道最后是在第零位加反码,第二位加原码呢?
Booth算法给出的是,在0011右边添一个虚假位0。即0011.0,此时右边两位是10,要加反码;右移后位0001.1,右边两位是11,不变,继续右移;变成0000.1,右边两位是01,要加原码。
(所以右边添一个0,和01,10这些都是为了运用这个规则,达到这个目的而创造出来的一个刚好合理的方法)
综上,Booth算法给出的10,01,00,11的编码规则,实际上为了让我们知道,哪个1是正的,如我们的0111 X 0100中 0100的1;哪个1是负的,即0111 X 0010中 0010 中的1.
继续思考后,可以知道负的1总是出现在从右往左,连续的零(或0个零)之后遇到第一个1的位置。正的1总是出现在从右往左,连续的1(最少一个1)之后遇到的第一个0。
这是由减法后的性质来决定的,因为 0110 = 1000 - 0010, 0111 = 1000 - 0001, 0010 = 0100 - 0010.
希望大家能懂!如果大家有疑惑,可以评论区与我联系!