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
|