일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- java
- placehoder
- 오라클
- C언어 변수
- C언어 함수
- Google reCaptcha
- 텍스트 파일 읽기
- URL 다운로드
- C언어 구조체
- C언어 매크로
- gcc
- 자바
- C언어 배열
- SQL
- 포인터
- Naver SmartEditor
- TCP/IP 소켓
- 역순
- C언어
- GUI
- Spring email
- 날짜
- HTML5
- Spring google
- C언어 파일입출력
- Oracle
- Vim
- jsp
- C언어 메모리
- 구글 reCaptcha
- Today
- Total
easy software
JAVA로 구현한 Booth Algorithm 본문
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]);
}
}