C 语言 BOOTHS 算法

2024年8月28日 | 阅读 7 分钟

Booth算法是一种用于乘两个带符号的二进制值乘法算法。该算法在计算机数学中经常使用,由Andrew Donald Booth1951年开发。

该技术通过减少乘法所需的加法运算次数来提高处理效率。它通过执行一系列移位加法来实现这一点,这些操作可以通过简单的硬件电路轻松完成。

在本文中,我们将介绍Booth方法,并向您展示如何使用C编程语言来实现它。

Booth算法

这些观察结果构成了Booth算法的基础

  • 可以使用左移操作来乘以二。
  • 可以进行右移操作,如除以二。
  • 如果一个二进制数由一串连续的1然后是0组成,我们可以用一个单一的1然后相同数量的0来替换这个字符串,得到的数字将等于原始数字。

这些发现使得可以使用以下步骤来定义Booth算法:

  • 初始值设置为0
  • 考虑将要相乘的两个二进制数表示为二的补码。
  • 为了使乘数的长度等于被乘数的长度,请在乘数右侧添加一个零位。
  • 从乘数最右边的位开始,一次检查两位。
  • 如果前两位是0和1,则从乘积中减去被乘数。
  • 如果两位都是1和0,则通过被乘数将乘积加倍。
  • 将乘数右移一位。
  • 重复步骤4-7,直到检查完所有乘数位。

在C中的应用

既然我们已经看到了一个例子,现在让我们在C编程语言中实现Booth算法。我们将创建一个函数,该函数接收两个带符号的二进制值作为输入,并输出两个值的和。

该函数将接受两个参数:指向表示被乘数和乘数的数组的指针。由于每个数字有n位,每个数组的长度将是n位。假定数组已经是二的补码形式。

让我们来看一下这个函数是如何实现的。

为了理解它的工作原理,让我们逐步分解这个实现。

我们的第一步是为乘积和数组分配内存。与存储方法中使用的寄存器值的数组不同,乘积数组将携带乘法的最终结果。两个数组的初始值均为0

接下来,我们通过遍历乘数的每一位来运行Booth算法。我们使用两个变量q0q[n-1]来跟踪乘数的最新位和前一位。

在每次迭代中,将当前乘数位与前一位进行比较,其中有两种情况:q0 = 0, q[n-1] = 1,或 q0 = 1, q[n-1] = 0。然后,根据a的当前位的值,通过加或减被乘数来对a寄存器执行必要的操作。

a寄存器的当前位复制到q的最低有效位,同时将aq都向右移动一位。然后,我们对每个乘数位再次执行此过程。

在释放a寄存器使用的内存并将其内容复制到乘积数组后,我们返回乘积数组。

示例

这是使用Booth算法来乘两个带符号值的C程序的源代码。C程序已成功编译并执行。下面还显示了程序的输出。

输出

BOOTH'S MULTIPLICATION ALGORITHM
Enter two numbers to multiply: 
Both must be less than 16
Enter A: 1
Enter B: 11
Expected product = 11

Binary Equivalents are: 
A = 00001
B = 01011
B'+ 1 = 10101

-->
SUB B: 10101:00001
AR-SHIFT: 11010:10000
-->
ADD B: 00101:10000
AR-SHIFT: 00010:11000
-->
AR-SHIFT: 00001:01100
-->
AR-SHIFT: 00000:10110
-->
AR-SHIFT: 00000:01011
Product is = 0000001011

结论

总之,Booth算法是用于表示为2的补码的带符号整数的二进制乘法的有用技术。与传统的乘法技术相比,该过程仅需要根据乘数位值进行移位和加或减被乘数。我们提供了一个基于位运算的Booth方法在C语言中的实现,并附带一个实际应用。