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