**布斯乘法算法**（英語：）是计算机中一种利用数的2的补码形式来计算乘法的算法。该算法由安德鲁·唐纳德·布思于1950年发明，当时他在伦敦大学柏贝克学院做晶体学研究。布斯曾使用过一种台式计算器，由于用这种计算器来做移位计算比加法快，他发明了该算法来加快计算速度。布斯算法在计算机体系结构学科中备受关注。

算法描述
----

对于*N*位乘数*Y*，布斯算法检查其2的补码形式的最后一位和一个隐含的低位，命名为*y*-1，初始值为0。对于*y**i*, *i* = 0, 1, ... *N* - 1，考察*y**i*和*y**i* - 1。当这两位相同时，存放积的累加器*P*的值保持不变。当*y**i* = 0且*y**i* - 1 = 1时，被乘数乘以2*i*加到*P*中。当*y**i* = 1且*y**i* - 1 = 0时，从*P*中减去被乘数乘以2*i*的值。算法结束后，*P*中的数即为乘法结果。

该算法对被乘数和积这两个数的表达方式并没有作规定。一般地，和乘数一样，可以采用2的补码方式表达。也可以采用其他计数形式，只要支持加减法就行。这个算法从乘数的最低位执行到最高位，从*i* = 0开始，接下来和2*i*的乘法被累加器*P*的算术右移所取代。较低位可以被移出，加减法可以只在*P*的前*N*位上进行。

典型实现
----

布斯算法的实现，可以通过重复地在*P*上加两个预设值*A*和 S其中的一个，然后对*P*实施算术右移。设*m*和*r*分别为被乘数和乘数，再令*x*和*y*分别为*m*和*r*中的数字位数。

1. 确定*A*和*S*的值，以及*P*的初始值。这三个数字的长度都应等于（*x* + *y* + 1）：
	1. 对于*A*，以*m*的值填充前x位（最靠左的位），用零填满剩下的（*y* + 1）位；
	2. 对于*S*，以（ - *m*）的值填充前x位，用零填满剩下的（*y* + 1）位；
	3. 对于*P*：用0填满最左的*x*位，将*r*的值附加在尾部；最右一位用零占位（辅助位，当i=0时i-1=-1,指的就是这个辅助位）；
2. 考察*P*的最右两位：
	1. 如果等于01，求出*P* + *A*的值，忽略上溢；
	2. 如果等于10，求出*P* + *S*的值，忽略上溢；
	3. 如果等于00，不做任何运算，在下一步中直接采用*P*的值；
	4. 如果等于11，不做任何运算，在下一步中直接采用*P*的值。
3. 对第2步中得到的值进行算术右移一位，并将结果赋给*P*；
4. 重复第2步和第3步，一共做*y*次；
5. 舍掉*P*的最右一位，得到的即为*m*和*r*的积。

换另一种说法：把前x位用一个单独的数R0表示，中间y位用另一个数表示R1表示，辅助位用Z表示
在这里，要通过重复的把R0加上或者减去m来得到结果。具体如下：
初始值R0=0,R1=r.Z=0,此时来考查yi和yi-1这两位，在这里就是r的最后一位和Z的值。这里要说下为什么每次看的都是这两位了。在下边每次运算后都会把R0,R1,Z中的值右移一次，RO的最后一位移入R1的高位，R1的最后一位移入Z。这里要注意的是在右移R0时，如果他的最高位是1,则移位后最高位用1填充，如果最高位是0，移位后最高位用0填充。接下来要按r的最后一位和Z的值来判断怎么加减了：

1. 1. 如果为01,则R0+m，进位忽略。然后R0,R1,Z右移一位，再下一步判断，直到把R1的每一位都判断过后为结束
	2. 如果为10,则R0-m，借位忽略（只要x位的R0的值）。然后R0,R1,Z右移一位，再下一步判断，直到把R1的每一位都判断过后为结束
	3. 如果为00或是11,则R0的值保持不变。然后R0,R1,Z右移一位，再下一步判断，直到把R1的每一位都判断过后为结束

最后是结果，结果就是R0并上R1的值。比如R0=3,R1=25,结果就是325.

算法原理
----

考虑一个由若干个0包围着若干个1的正的二进制乘数，比如00111110，积可以表达为：

{\displaystyle M\times \,^{\prime \prime }0\;0\;1\;1\;1\;1\;1\;0\,^{\prime \prime }=M\times (2^{5}+2^{4}+2^{3}+2^{2}+2^{1})=M\times 62}
其中，M代表被乘数。变形为下式可以使运算次数可以减为两次：

{\displaystyle M\times \,^{\prime \prime }0\;1\;0\;0\;0\;0{\mbox{-1}}\;0\,^{\prime \prime }=M\times (2^{6}-2^{1})=M\times 62}。
事实上，任何二进制数中连续的1可以被分解为两个二进制数之差：

{\displaystyle (\ldots 0\overbrace {1\ldots 1} ^{n}0\ldots )\_{2}\equiv (\ldots 1\overbrace {0\ldots 0} ^{n}0\ldots )\_{2}-(\ldots 0\overbrace {0\ldots 1} ^{n}0\ldots )\_{2}}。
因此，我们可以用更简单的运算来替换原数中连续为1的数字的乘法，通过加上乘数，对部分积进行移位运算，最后再将之从乘数中减去。它利用了我们在针对为零的位做乘法时，不需要做其他运算，只需移位这一特点，这很像我们在做和99的乘法时利用99 = 100 − 1这一性质。这种模式可以扩展应用于任何一串数字中连续为1的部分（包括只有一个1的情况）。那么，

{\displaystyle M\times \,^{\prime \prime }0\;0\;1\;1\;1\;0\;1\;0\,^{\prime \prime }=M\times (2^{5}+2^{4}+2^{3}+2^{1})=M\times 58}
{\displaystyle M\times \,^{\prime \prime }0\;1\;0\;0{\mbox{-1}}\;0\;1\;0\,^{\prime \prime }=M\times (2^{6}-2^{3}+2^{1})=M\times 58}。
布斯算法遵从这种模式，它在遇到一串数字中的第一组从0到1的变化时（即遇到01时）执行加法，在遇到这一串连续1的尾部时（即遇到10时）执行减法。这在乘数为负时同样有效。当乘数中的连续1比较多时（形成比较长的1串时），布斯算法较一般的乘法算法执行的加减法运算少。

参考来源
----

1. ↑  
Chi-hau Chen.. CRC Press. 1988: 234. ISBN 9780824779566.

延伸阅读
----

1. Andrew D. Booth. A signed binary multiplication technique. The Quarterly Journal of Mechanics and Applied Mathematics, Volume IV, Pt. 2  （页面存档备份，存于）
2. Collin, Andrew. Andrew Booth's Computers at Birkbeck College （页面存档备份，存于）. *Resurrection*, Issue 5, Spring 1993. London: Computer Conservation Society.
3. Patterson, David and John Hennessy. *Computer Organization and Design: The Hardware/Software Interface, Second Edition*. ISBN 1-55860-428-6. San Francisco, California: Morgan Kaufmann Publishers. 1998.
4. Stallings, William. *Computer Organization and Architecture: Designing for performance, Fifth Edition*. ISBN 0-13-081294-3. New Jersey: Prentice-Hall, Inc.. 2000.

外部链接
----

* Radix-4 Booth Encoding （页面存档备份，存于）
* Radix-8 Booth Encoding in A Formal Theory of RTL and Computer Arithmetic
* Booth's Algorithm
* Booth's Algorithm JavaScript Simulator （页面存档备份，存于）
* Implementation in Verilog
* Implementation in Python （页面存档备份，存于）
* 布斯算法 (带符号的二进制乘法)[永久]