137 lines
3.7 KiB
Java
137 lines
3.7 KiB
Java
/*
|
||
This is a Java Program to implement Booth Algorithm. This is a program to compute product of two numbers by using Booth’s Algorithm. This program is implemented for multiplying numbers in the range -7 to 7. However same principle can be extended to other numbers too.
|
||
*/
|
||
|
||
/**
|
||
** Java Program to Implement Booth Algorithm
|
||
**/
|
||
|
||
import java.util.Scanner;
|
||
|
||
/** Class Booth **/
|
||
public class Booth
|
||
{
|
||
public static Scanner s = new Scanner(System.in);
|
||
/** Function to multiply **/
|
||
public int multiply(int n1, int n2)
|
||
{
|
||
int[] m = binary(n1);
|
||
int[] m1 = binary(-n1);
|
||
int[] r = binary(n2);
|
||
int[] A = new int[9];
|
||
int[] S = new int[9];
|
||
int[] P = new int[9];
|
||
for (int i = 0; i < 4; i++)
|
||
{
|
||
A[i] = m[i];
|
||
S[i] = m1[i];
|
||
P[i + 4] = r[i];
|
||
}
|
||
display(A, 'A');
|
||
display(S, 'S');
|
||
display(P, 'P');
|
||
System.out.println();
|
||
for (int i = 0; i < 4; i++)
|
||
{
|
||
if (P[7] == 0 && P[8] == 0);
|
||
// do nothing
|
||
else if (P[7] == 1 && P[8] == 0)
|
||
add(P, S);
|
||
else if (P[7] == 0 && P[8] == 1)
|
||
add(P, A);
|
||
else if (P[7] == 1 && P[8] == 1);
|
||
// do nothing
|
||
rightShift(P);
|
||
display(P, 'P');
|
||
}
|
||
return getDecimal(P);
|
||
}
|
||
/** Function to get Decimal equivalent of P **/
|
||
public int getDecimal(int[] B)
|
||
{
|
||
int p = 0;
|
||
int t = 1;
|
||
for (int i = 7; i >= 0; i--, t *= 2)
|
||
p += (B[i] * t);
|
||
if (p > 64)
|
||
p = -(256 - p);
|
||
return p;
|
||
}
|
||
/** Function to right shift array **/
|
||
public void rightShift(int[] A)
|
||
{
|
||
for (int i = 8; i >= 1; i--)
|
||
A[i] = A[i - 1];
|
||
}
|
||
/** Function to add two binary arrays **/
|
||
public void add(int[] A, int[] B)
|
||
{
|
||
int carry = 0;
|
||
for (int i = 8; i >= 0; i--)
|
||
{
|
||
int temp = A[i] + B[i] + carry;
|
||
A[i] = temp % 2;
|
||
carry = temp / 2;
|
||
}
|
||
}
|
||
/** Function to get binary of a number **/
|
||
public int[] binary(int n)
|
||
{
|
||
int[] bin = new int[4];
|
||
int ctr = 3;
|
||
int num = n;
|
||
/** for negative numbers 2 complment **/
|
||
if (n < 0)
|
||
num = 16 + n;
|
||
while (num != 0)
|
||
{
|
||
bin[ctr--] = num % 2;
|
||
num /= 2;
|
||
}
|
||
return bin;
|
||
}
|
||
/** Function to print array **/
|
||
public void display(int[] P, char ch)
|
||
{
|
||
System.out.print("\n"+ ch +" : ");
|
||
for (int i = 0; i < P.length; i++)
|
||
{
|
||
if (i == 4)
|
||
System.out.print(" ");
|
||
if (i == 8)
|
||
System.out.print(" ");
|
||
System.out.print(P[i]);
|
||
}
|
||
}
|
||
/** Main function **/
|
||
public static void main (String[] args)
|
||
{
|
||
Scanner scan = new Scanner(System.in);
|
||
System.out.println("Booth Algorithm Test\n");
|
||
/** Make an object of Booth class **/
|
||
Booth b = new Booth();
|
||
/** Accept two integers **/
|
||
System.out.println("Enter two integer numbers\n");
|
||
int n1 = scan.nextInt();
|
||
int n2 = scan.nextInt();
|
||
int result = b.multiply(n1, n2);
|
||
System.out.println("\n\nResult : "+ n1 +" * "+ n2 +" = "+ result);
|
||
}
|
||
}
|
||
|
||
/*
|
||
|
||
Enter two integer numbers
|
||
|
||
7 -7
|
||
|
||
A : 0111 0000 0
|
||
S : 1001 0000 0
|
||
P : 0000 1001 0
|
||
|
||
P : 1100 1100 1
|
||
P : 0001 1110 0
|
||
P : 0000 1111 0
|
||
P : 1100 1111 1
|
||
|
||
Result : 7 * -7 = -49 |