C++ 程序实现 Booth 乘法算法,用于将 2 个有符号数相乘

c++server side programmingprogramming

Booth 算法是一种乘法算法,它将两个有符号二进制数以 2 的补码表示法相乘。Booth 使用的台式计算器的移位速度比加法更快,因此他创建了该算法来提高其速度。

算法

开始
   将被乘数放入 BR,将乘数放入 QR
      然后该算法按照以下条件工作:
   1. 如果 Qn 和 Qn+1 相同,即 00 或 11,则执行算术移位 1 位。
   2.如果 Qn Qn+1 = 10,则执行 A= A + BR 并执行 1 位算术移位。
   3. 如果 Qn Qn+1 = 01,则执行 A= A – BR 并执行 1 位算术移位。
结束

示例代码

#include<iostream>
using namespace std;
void add(int a[], int x[], int q);
void complement(int a[], int n) {
   int i;
   int x[8] = { NULL };
   x[0] = 1;
   for (i = 0; i < n; i++) {
      a[i] = (a[i] + 1) % 2;
   }
   add(a, x, n);
}
void add(int ac[], int x[], int q) {
   int i, c = 0;
   for (i = 0; i < q; i++) {
      ac[i] = ac[i] + x[i] + c;
      if (ac[i] > 1) {
         ac[i] = ac[i] % 2;
         c = 1;
      }else
         c = 0;
      }
   }
   void ashr(int ac[], int qr[], int &qn, int q) {
      int temp, i;
      temp = ac[0];
      qn = qr[0];
      cout << "\t\tashr\t\t";
      for (i = 0; i < q - 1; i++) {
         ac[i] = ac[i + 1];
         qr[i] = qr[i + 1];
      }
      qr[q - 1] = temp;
   }
   void display(int ac[], int qr[], int qrn) {
      int i;
      for (i = qrn - 1; i >= 0; i--)
         cout << ac[i];
      cout << " ";
      for (i = qrn - 1; i >= 0; i--)
         cout << qr[i];
   }
   int main(int argc, char **argv) {
      int mt[10], br[10], qr[10], sc, ac[10] = { 0 };
      int brn, qrn, i, qn, temp;
      cout << "\n--Enter the multiplicand and multipier in signed 2's
      complement form if negative--";
      cout << "\n Number of multiplicand bit=";
      cin >> brn;
      cout << "\nmultiplicand=";
      for (i = brn - 1; i >= 0; i--)
         cin >> br[i]; //multiplicand
      for (i = brn - 1; i >= 0; i--)
         mt[i] = br[i];
      complement(mt, brn);
      cout << "\nNo. of multiplier bit=";
      cin >> qrn;
      sc = qrn;
      cout << "Multiplier=";
      for (i = qrn - 1; i >= 0; i--)
         cin >> qr[i];
         qn = 0;
         temp = 0;
         cout << "qn\tq[n+1]\t\tBR\t\tAC\tQR\t\tsc\n";
         cout << "\t\t\tinitial\t\t";
         display(ac, qr, qrn);
         cout << "\t\t" << sc << "\n";
         while (sc != 0) {
            cout << qr[0] << "\t" << qn;
            if ((qn + qr[0]) == 1) {
               if (temp == 0) {
                  add(ac, mt, qrn);
                  cout << "\t\tsubtracting BR\t";
                  for (i = qrn - 1; i >= 0; i--)
                     cout << ac[i];
                  temp = 1;
               }
            else if (temp == 1) {
               add(ac, br, qrn);
               cout << "\t\tadding BR\t";
               for (i = qrn - 1; i >= 0; i--)
                  cout << ac[i];
                  temp = 0;
            }
            cout << "\n\t";
            ashr(ac, qr, qn, qrn);
         }
         else if (qn - qr[0] == 0)
            ashr(ac, qr, qn, qrn);
            display(ac, qr, qrn);
            cout << "\t";
            sc--;
            cout << "\t" << sc << "\n";
   }
   cout << "Result=";
   display(ac, qr, qrn);
}

输出

--Enter the multiplicand and multipier in signed 2's complement form if
negative--
Number of multiplicand bit=5
multiplicand=0 1 1 1 1
No. of multiplier bit=5
Multiplier=1 0 1 1 1
qn q[n+1] BR AC QR sc
initial 00000 10111 5
1 0 subtracting BR 10001
ashr 11000 11011 4
1 1 ashr 11100 01101 3
1 1 ashr 11110 00110 2
0 1 adding BR 01101
ashr 00110 10011 1
1 0 subtracting BR 10111
ashr 11011 11001 0
Result=11011 11001

相关文章