반응형
컴퓨터 구조 / 2003년 1학기 / 김지홍 교수님
Booth's Algorithm을 이용한 Low Level적인 곱셈을 시뮬레이션
/*************************************************************************
** **
** Assignment 3. 1번 Booth's algorithm simulator **
** **
** ca49 2001-12204 이준희 **
** **
*************************************************************************/
#include <stdlib.h>
#include <string.h>
#include <iostream.h>
#include <stdio.h>
#include <math.h>
void printHex(int hex) // int를 16진수 형식으로 출력하는 함수
{
if (hex < 0)
printf("0x%X", hex); // 음수이면, %X로 그냥 출력
else if (hex == 0)
printf("0x00000000"); // 0이면 0을 출력
else
{
printf("0x");
for (int i=7; pow(16, i) > hex; i--) // 양수이면, 그만큼 0을 앞에 출력
printf("0");
printf("%X", hex);
}
return;
}
void booth(int mcand, int mlier, int* p) // 실제 곱하기를 하는 함수
{
long long int product; // 64비트 정수. hi+lo 의 역할
int prev = 0; // 이전bit. 현재는 phantom zero.
int count = 0;
int output; // for 출력
product = mlier; // product의 초기값은 multiplier
for (int i=1; i<33; i++)
{
product += ((prev - (product & 1)) * mcand) << 32;
// product의 상위 32bit에 [ (이전bit - 지금bit) * multilicand ] 를 더합니다.
prev = (int)product & 1; // shift 하기 전에, 이전bit에 현재bit을 저장.
product >>= 1; // 오른쪽 shift
output = (mcand*output < 0) ? (product + 1) : product;
// 출력값이 음수일 경우 2's complement 표현을 위해 조정.
if (p[count] == i) // 출력해야하는 번째의 iteration일 경우 출력!
{
printf("%dth iteration: current_product = ", i);
printHex(output);
printf(" (%d in decimal notation)\n", output);
p[count] = 0;
count++;
}
}
printf("Final product = "); // Final product 출력!
printHex(output);
printf(" (%d in decimal notation)\n", output);
}
int main(int argc, char* argv[])
{
int a, b;
int p[32] = {0};
if (argc < 5) // argument 개수 검사
{
cout << "Error : The Number of argument is illegal." << endl;
return 1;
}
int count = 0;
for (int i=1; i<argc; i+=2)
{
if (!strcmp(argv[i], "-a"))
a = atoi(argv[i+1]);
else if (!strcmp(argv[i], "-b"))
b = atoi(argv[i+1]);
else if (!strcmp(argv[i], "-p"))
{
p[count] = atoi(argv[i+1]);
count++; // 몇 번째의 iteration을 출력해야하는지 저장
}
else
{
cout << "Error : Arguments is illegal." << endl;
return 1;
}
}
printf("A : ");
printHex(a);
printf("\nB : ");
printHex(b);
printf("\n"); // A, B 출력
booth(a, b, p);
a = b = count = 0;
char command[50] = {0};
char seps[] = " \t"; // 입력받은 커맨드를 토큰으로 자를 기준
char *token, *next;
printf("(Booth) ");
fgets(command, 50, stdin);
while (strncmp(command, "exit", 4))
{
token = strtok( command, seps );
next = strtok( NULL, seps ); // 한번에 2개의 토큰을 읽음
while( (token != NULL) && (next != NULL) )
{
if (!strcmp(token, "-a"))
a = atoi(next);
else if (!strcmp(token, "-b"))
b = atoi(next);
else if (!strcmp(token, "-p"))
{
p[count] = atoi(next);
count++;
}
else
{
cout << "Error : Arguments is illegal." << endl;
return 1;
}
token = strtok( NULL, seps );
next = strtok( NULL, seps );
}
printf("A : ");
printHex(a);
printf("\nB : ");
printHex(b);
printf("\n"); // A, B 출력
booth(a, b, p);
a = b = count = 0;
printf("(Booth) ");
fgets(command, 50, stdin);
}
return 0;
}
Booth's Algorithm을 이용한 Low Level적인 곱셈을 시뮬레이션
/*************************************************************************
** **
** Assignment 3. 1번 Booth's algorithm simulator **
** **
** ca49 2001-12204 이준희 **
** **
*************************************************************************/
#include <stdlib.h>
#include <string.h>
#include <iostream.h>
#include <stdio.h>
#include <math.h>
void printHex(int hex) // int를 16진수 형식으로 출력하는 함수
{
if (hex < 0)
printf("0x%X", hex); // 음수이면, %X로 그냥 출력
else if (hex == 0)
printf("0x00000000"); // 0이면 0을 출력
else
{
printf("0x");
for (int i=7; pow(16, i) > hex; i--) // 양수이면, 그만큼 0을 앞에 출력
printf("0");
printf("%X", hex);
}
return;
}
void booth(int mcand, int mlier, int* p) // 실제 곱하기를 하는 함수
{
long long int product; // 64비트 정수. hi+lo 의 역할
int prev = 0; // 이전bit. 현재는 phantom zero.
int count = 0;
int output; // for 출력
product = mlier; // product의 초기값은 multiplier
for (int i=1; i<33; i++)
{
product += ((prev - (product & 1)) * mcand) << 32;
// product의 상위 32bit에 [ (이전bit - 지금bit) * multilicand ] 를 더합니다.
prev = (int)product & 1; // shift 하기 전에, 이전bit에 현재bit을 저장.
product >>= 1; // 오른쪽 shift
output = (mcand*output < 0) ? (product + 1) : product;
// 출력값이 음수일 경우 2's complement 표현을 위해 조정.
if (p[count] == i) // 출력해야하는 번째의 iteration일 경우 출력!
{
printf("%dth iteration: current_product = ", i);
printHex(output);
printf(" (%d in decimal notation)\n", output);
p[count] = 0;
count++;
}
}
printf("Final product = "); // Final product 출력!
printHex(output);
printf(" (%d in decimal notation)\n", output);
}
int main(int argc, char* argv[])
{
int a, b;
int p[32] = {0};
if (argc < 5) // argument 개수 검사
{
cout << "Error : The Number of argument is illegal." << endl;
return 1;
}
int count = 0;
for (int i=1; i<argc; i+=2)
{
if (!strcmp(argv[i], "-a"))
a = atoi(argv[i+1]);
else if (!strcmp(argv[i], "-b"))
b = atoi(argv[i+1]);
else if (!strcmp(argv[i], "-p"))
{
p[count] = atoi(argv[i+1]);
count++; // 몇 번째의 iteration을 출력해야하는지 저장
}
else
{
cout << "Error : Arguments is illegal." << endl;
return 1;
}
}
printf("A : ");
printHex(a);
printf("\nB : ");
printHex(b);
printf("\n"); // A, B 출력
booth(a, b, p);
a = b = count = 0;
char command[50] = {0};
char seps[] = " \t"; // 입력받은 커맨드를 토큰으로 자를 기준
char *token, *next;
printf("(Booth) ");
fgets(command, 50, stdin);
while (strncmp(command, "exit", 4))
{
token = strtok( command, seps );
next = strtok( NULL, seps ); // 한번에 2개의 토큰을 읽음
while( (token != NULL) && (next != NULL) )
{
if (!strcmp(token, "-a"))
a = atoi(next);
else if (!strcmp(token, "-b"))
b = atoi(next);
else if (!strcmp(token, "-p"))
{
p[count] = atoi(next);
count++;
}
else
{
cout << "Error : Arguments is illegal." << endl;
return 1;
}
token = strtok( NULL, seps );
next = strtok( NULL, seps );
}
printf("A : ");
printHex(a);
printf("\nB : ");
printHex(b);
printf("\n"); // A, B 출력
booth(a, b, p);
a = b = count = 0;
printf("(Booth) ");
fgets(command, 50, stdin);
}
return 0;
}
반응형