booth补码乘法算法中乘数的右移规则是啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了booth补码乘法算法中乘数的右移规则是啥?相关的知识,希望对你有一定的参考价值。
这是国家计算机三级PC教程里的。
booth补码乘法算法中乘数的右移规则是什么?为什么和二进制的算术右移规则不一样呢?比如:
设被乘数M=0111(7),乘数Q=0011(3),相乘过程如下:
A Q Q_
0000 0011 0 初始值
1001 0011 0 A=A-M
1100 1001 1 右移(第一次循环)
1110 0100 1 右移(第二次循环)
0101 0100 1 A=A+M
0010 1010 0 右移(第三次循环)
0001 0101 0 右移(第四次循环)
乘法运算结束后,所得结果中,A是乘机高位部分,Q是乘积低位部分,即乘积=00010101(即21)
问题是:
其中A的右移是遵从二进制的算术右移规则的,即整体右移,移出的位丢弃,空出的高位用与原高位相同的数字补出;可是Q的右移似乎就不遵从这个规则了,它遵循的是什么的右移规则呢?
[计算机组成原理] Booth算法 —— 补码一位乘法
x * y = z
运算规则:
1.和原码一位乘法不同,补码一位乘法的符号位是参加运算的,且运算结果和所有参加运算的数都是补码形式。
2.乘数 x 取双符号位参与运算,部分积的初始值为0;
乘数 y 取单符号位参与运算。
3.乘数 y 首先在末尾添加一个辅助位 0 ,每次讨论都是取 y 的最后两位,但每次移动仅移动一位。
4.判断 y 的最后两位是规则如下:
- 00 或者 11 时,直接右移一位;
- 01 时,先加 x 的补,然后右移一位;
- 10 时,先加 -x 的补,然后右移一位。
5.有个特例,最后一步不用右移了。
举个栗子:
设 x = -0.1101 , y = 0.1011
则 [x]补 = 11.0011 ,[-x]补 = 00.1101
一开始 部分积初始值:00.0000
先给y补一个辅助位0,得到 y = 0.10110
首先,从y的最后两位开始看,0.10110 ,为 10 ,对应规则 “先加[-x]补,再右移一位” :
部分积 00.0000 + 00.1101 = 00.1101 ,右移一位得到 00.01101
接着,y 右移一位再看,0.10110,为 11 ,对应规则“直接右移一位”:
部分积 00.001101
然后,y再右移一位再看,0.10110 ,为 01 ,对应规则“先加[x]补,再右移一位”:
00.001101 部分积
+ 11.0011 [x]补
--------------------
= 11.011001 部分积
部分积 00.001101 + 11.0011 = 11.011001 ,右移一位得到 11.1011001 (注意这里符号位移动后,仍然保持为 11 )
接着,y再右移一位再看,0.10110 ,为 10 ,对应规则“先加[-x]补,再右移一位”:
部分积 11.1011001 + 00.1101 = 00.1000001 ,右移一位得到 00.01000001
最后,y再右移一位再看,0.10110 ,为 01 ,对应规则“先加[x]补,再右移一位”:
部分积 00.01000001 + 11.0011 = 11.01110001 ,但这已经是最后一步,不用再右移了,
所以最后结果是 1.01110001 (注意:这是x*y的补码)
以上是关于booth补码乘法算法中乘数的右移规则是啥?的主要内容,如果未能解决你的问题,请参考以下文章