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

가장 처음 배우는것이 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