[C] 2진수, 8진수, 16진수,N진수

spring·2020년 11월 9일
0

가장 처음 배우는것이 2진수 변환이다. 정수 n을 2로 나눠가면서 0이될때까지의 정보를 저장 & 역수능로 출력하는것이라고 배웠다.

비트연산을 조금만 사용하면 추가저장공간이 필요없는 2진수를 출력할 수 있다.

n은 실제로 비트로 존재하므로, 그것을 그대로 출력하면 된다.

void print_binary(unsigned n) {
	int c = 32;
	while (c--){
		//putchar(((n&~0x7fffffff) >> 31) + 48);
		putchar((n>>31)+48);
		n <<= 1;
	}
}

원리는 간단하다. 0x7ff…0111111…이다. 16진수 계산에 능하다면 바로 알아차릴 것이다.

이것의 비트를 반전시키면 10000…이고 이를 & 연산을 하면 MSB만이 존재할 것이다.

이 MSB를 출력하는 원리이다.

8진수와 16진수는 쉽다.

    void print_octal(unsigned n) {
        printf("%o\n", n);
    }
    void print_hex(unsigned n) {
        printf("%x\n", n);
    }

그럼이제 10진수를 n진수로 바꾸는 방법을 알아보자.

    void print_base(unsigned n, int base) {
        char* s = "0123456789abcdefghijklmnopqrstuvwxyz";
        char a[32] = { 0 }, *p = a;
        memset(a, '0', 31);
        div_t d = { n, 0 };
        while (d.quot){
            d = div(d.quot, base);
            *p++ = s[d.rem];
        }
        while (p-- != a)putchar(*p);
        putchar('\n');
    }

위에서 봤듯이, 배열이 필요하다. 배열의 크기는 2진수일때 가장 크므로 32개를 잡았다.
(string 아님 NULL 필요없음)

이제 어떤 n 진수를 10진수로 변환하는법은 strtol 이란 함수로 할 수 있다.

    #include<stdlib.h>
    long int strtol(const char *nptr, char **endptr, int base);

nptr 에는 어떤 진수로 된 문자열

endptr은 의미없다 NULL 넣자.

base는 그 문자열이 가진 진수를 적으면 된다.

printf("%d\n", strtol("40", NULL, 16));    //64
profile
Researcher & Developer @ NAVER Corp | Designer @ HONGIK Univ.

0개의 댓글