IT/소스코드

[C++] Booth's Algorithm Simulator

zzun 2003. 7. 10. 06:37
반응형
컴퓨터 구조 / 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;
}
반응형