c·c++/c 프로그래밍

진법변환

바로이순간 2012. 7. 2. 18:40

#include <stdio.h> 

__int64 bin2dec(char a[]); 

void tobinstr(char a[], __int64); 

int main() { 

    __int64 n; 

    int menu=1;

    char numstr[100]={0,};


    while(menu!=5) { 

        puts("***********************"); 

        puts("* 1.  2진수 입력: "); 

        puts("* 2. 10진수 입력: "); 

        puts("* 3.  8진수 입력: "); 

        puts("* 4. 16진수 입력: "); 

        puts("* 5. 끝내기"); 

        puts("***********************"); 

        printf("선택="); 

        scanf("%d", &menu); 

        fflush(stdin); 

        switch(menu) { 

            case 1: 

                printf("2진수입력: ");

                gets(numstr);

                n=bin2dec(numstr); 

                break; 

            case 2: 

                printf("십진수입력: ");

                scanf("%lld", &n); 

                break; 

            case 3: 

                printf("8진수입력: ");

                scanf("%llo", &n); 

                break; 

            case 4: 

                printf("16진수입력: ");

                scanf("%llx", &n); 

                break; 

        } 

        if(menu==5) break;

        if(menu>1) tobinstr(numstr, n);

       switch(menu) { 

            case 1: 

                printf("십진수: %lld  팔진수: 0%llo 16진수 0x%llX\n", n, n, n);

                break; 

            case 2: 

                printf("이진수: %s  팔진수: 0%llo 16진수 0x%llX\n", numstr, n, n);

                break; 

            case 3: 

                printf("이진수: %s  십진수: %lld 16진수 0x%llX\n", numstr, n, n);

                break; 

            case 4: 

                printf("이진수: %s  팔진수: 0%llo  십진수 %lld\n", numstr, n, n);

                break; 

        } 

    }


    return 0;


// 주어진 2진수를 나타내는 문자열을 정수로 바꾸는 함수입니다.

__int64 bin2dec(char a[]) { 

    // 문자열의 인덱스를 위한 변수 i 정수값을 위한 변수 x

    __int64 i=0, x=0;


    // 문자열의 끝을 만날때 까지 가면서

    while(a[i]) {


        // 지금까지 읽은(처리한) 문자열 다음에 문자가 나오면 정수의 값은 2배가 되고

        // 현재 문자가 '0' 이거나 '1'이냐에 따라서 0이나 1이 더해지게 된다.

        x=x*2+a[i]-'0';


        i=i+1;   // 다음 문자로 가기 위해서 i를 증가시켜준다.

    }

    return x;

}


// 주어진 정수를 2진수를 나타내는 문자열로 바꾸어 주는 함수이다.

void tobinstr(char a[], __int64 n) { 

    // i는 문자열의 인덱스를 나타낸다. x는 n의 최대비트의 값에서 

    // 출발하여 가장 아래 값인 1까지 내려오고 결국은 0이 되어서 끝이 난다.

    __int64 i=0, x=1;


    // 처음에는 x의 값이 1로 출발하여 2배를 계속해 나간다.

    // x의 값이 n의 값 이상이 되면 멈춘다.

    while(x<n) x+=x;


    // 만약 x의 값이 n의 값보다 크다면 x의 값을 2로 나누어 준다.

    // 즉 x는 n의 가장 높은 비트의 값을 가지고 있다.

    if(x>n) x=x/2;


    // x의 값이 0 보다 클 경우 계속한다.

    while(x>0L) {

        // 만약 n이 x가 나타내는 비트자리가 있다면 '1'을 없다면 '0'을 

        // 문자열에 넣어준다.

        if(n&x) a[i]='1'; else a[i]='0';

        // i의 값을 1증가 시킨다.

        i=i+1;

        // x를 2로 나누어 준다. 한자리 내려오게 된다.

        x=x/2;

    }

    // a는 문자열이기 때문에 마지막에 널문자를 넣어 준다.

    a[i]=0;

}