easy software

JAVA로 구현한 Booth Algorithm 본문

JAVA/Algorism

JAVA로 구현한 Booth Algorithm

JAVA 웹개발자 2015. 1. 6. 23:56

Booth 알고리즘은 부호가 있는 2진수를 곱하는 알고리즘 입니다.

 

자세한 개념은 다른 블로그나, 참고 서적을 참고해 주시기 바랍니다.

 

제가 작성한 글에서는 코드에 주석을 달아서만 설명했기 때문에 이해를 하지 못하는 분이 계실 수 있습니다.

 

M과 Q의 값은 여러분들이 변경해도 됩니다.

 

 

제가 입력한 값은 M 1101이고, Q의 값은 1011입니다. Q 배열의 4번 인덱스는 Q-1입니다.

 

//booth 알고리즘을 구현한 프로그램

package booth;

 

public class Booth {

 

 public static void main(String[] args) {
  // TODO Auto-generated method stub

 

      int[] M = {1,1,0,1};
      int[] Q = {1,0,1,1,0};
      int[] A = {0,0,0,0};
      int count = 4;
      int temp;//산술적 우측 Shift를 수행할 때 Q-1의 값을 임시로 저장할 변수

  

//count가 0일때 까지 반복 실행
  while(count > -1){
   
       //Q레지스터의 3번과 4번 배열이 1, 0 이면
       if(Q[3] == 1 && Q[4] == 0){
    
        //2의 보수를 만들기 위해 1이면 0, 0이면 1로 값을 변환
        for(int i = 0; i<4; i++){

             if(M[i] == 0)
                  M[i] = 1;

             else if(M[i] == 1)
                  M[i] = 0;
         }

   

 //2의 보수를 만들기 위해 M레지스터의 마지막 배열에 1을 더해줌
    M[3] = M[3] + 1;

      

  for(int i = 3; i>-1; i--){

             if(M[i] == 2){
              M[i-1] = M[i-1] + 1;
              M[i] = 0;
             }
        }

   

 //A레지스터에 A와 M을 더한 값을 저장
    for(int i = 3; i>-1; i--){
         A[i] = A[i] + M[i];

              

   if(A[i] == 2){
      A[i-1] = A[i-1] + 1;
      A[i] = 0;
    }

}

    

//산술적 우측 Shift
    temp = Q[4];
    
    for(int i = 1; i<5; i++)
         Q[i] = Q[i-1];

  

  Q[0] = A[3];

      

  for(int i = 1; i<4; i++)
     A[i] = A[i-1];

        

A[0] = temp;

  

  count--; //작업 완료 후 count를 1 감소
   }

 

  //Q레지스터의 3번과 4번 배열이 1, 1 이거나 0, 0 이면
   else if((Q[3] == 1 && Q[4] == 1) || Q[3] == 0 && Q[4] == 0){

    

temp = Q[4];
    
 //산술적 우측 Shift
 temp = Q[4];
    
 for(int i = 1; i<5; i++)
     Q[i] = Q[i-1];

   

 Q[0] = A[3];

   

 for(int i = 1; i<4; i++)
     A[i] = A[i-1];

   

 A[0] = temp;

    

count--; //작업 완료 후 count를 1 감소
   }
   

//Q레지스터의 3번과 4번 배열이 0, 1 이면

 else if(Q[3] == 1 && Q[4] == 0){

   

 //A레지스터에 A와 M을 더한 값을 저장
    for(int i = 3; i<0; i--){
     A[i] = A[i] + M[i];

    

 if(A[i] == 2){
      A[i-1] = A[i-1] + 1;
      A[i] = 0;
     }

 }

 

   //산술적 우측 Shift
    temp = Q[4];
    
        for(int i = 1; i<5; i++)
             Q[i] = Q[i-1];

    

    Q[0] = A[3];

              

 for(int i = 1; i<4; i++)
     A[i] = A[i-1];

   

A[0] = temp;

   

 count--; //작업 완료 후 count를 1 감소
   }
  }
  

System.out.print("M의 값 : ");
  
for(int i = 0; i<A.length; i++)
   System.out.print(A[i]);

  

      System.out.println();
  
      System.out.print("Q의 값 : ");

   

      for(int i = 0; i<Q.length-1; i++)
  

      System.out.print(Q[i]);
  
      System.out.println();
 
      System.out.print("Q-1의 값 : ");
  
      System.out.print(Q[4]);
 }
}

 

Comments