C언어 자체에는 십진수를 이진수로 변환하는 함수가 없기에, 비트 연산으로 직접 만들어야 합니다. 다음은 10/16진수 숫자를 2진수 문자열로, 2진수 문자열을 10/16진수 정수로 만드는 함수입니다. 32비트 정수용입니다.
프로그래밍에서 2진수를 직접 다루어야 하는 경우는 드물고, 대부분 10진수나 16진수를 사용합니다. 따라서 "00100110000110000100111000001110" 이런 2진수는 숫자가 아닌 그냥 평범한 문자열로서만 인식됩니다.
Binary 가 2진수이고, Decimal 이 10진수입니다.
10진수/16진수 <-> 2진수 변환 출력 예제
파일명: 0.cpp
#include <stdio.h>
char *intToBinary(int i); // 부호 있는 32비트 정수를, 2진수 문자열로 변환
char *uintToBinary(unsigned int i); // 부호 없는 32비트 정수를, 2진수 문자열로 변환
int binaryToInt(char *s); // 2진수 문자열을, 부호 있는 32비트 정수로 변환
unsigned int binaryToUint(char *s); // 2진수 문자열을, 부호 없는 32비트 정수로 변환
void main(void) {
puts("\n\nDecimal to Binary (int) :\n");
printf("%s\n", intToBinary(0x0));
printf("%s\n", intToBinary(0xFF));
printf("%s\n", intToBinary(0xFFFF));
printf("%s\n", intToBinary(-2147483647 - 1)); // int 최소값 = -2147483648
printf("%s\n", intToBinary(2147483647)); // int 최대값
printf("%s\n", intToBinary(639127054)); // 임의의 값
puts("\n\nDecimal to Binary (unsigned int) :\n");
printf("%s\n", uintToBinary(0x0));
printf("%s\n", uintToBinary(0xF));
printf("%s\n", uintToBinary(0xFF));
printf("%s\n", uintToBinary(0xFFFF));
printf("%s\n", uintToBinary(0xFFFFFFFF)); // unsigned int 최대값
puts("\n\nBinary to Decimal (int):");
printf("%d\n", binaryToInt("0"));
printf("%d\n", binaryToInt("1111"));
printf("%d\n", binaryToInt("11111111"));
printf("%d\n", binaryToInt("1111111111111111"));
printf("%d\n", binaryToInt("00000000000000001111111111111111"));
printf("%d\n", binaryToInt("01111111111111111111111111111111"));
puts("\n\nBinary to Decimal (unsigned int):");
printf("%u\n", binaryToUint("0"));
printf("%u\n", binaryToUint("1111"));
printf("%u\n", binaryToUint("11111111"));
printf("%u\n", binaryToUint("1111111111111111"));
printf("%u\n", binaryToUint("00000000000000001111111111111111"));
printf("%u\n", binaryToUint("11111111111111111111111111111111"));
printf("%u\n", binaryToUint("00100110000110000100111000001110"));
}
char *intToBinary(int i) {
static char s[32 + 1] = { '0', };
int count = 32;
do { s[--count] = '0' + (char) (i & 1);
i = i >> 1;
} while (count);
return s;
}
char *uintToBinary(unsigned int i) {
static char s[32 + 1] = { '0', };
int count = 32;
do { s[--count] = '0' + (char) (i & 1);
i = i >> 1;
} while (count);
return s;
}
int binaryToInt(char *s) {
int i = 0;
int count = 0;
while (s[count])
i = (i << 1) | (s[count++] - '0');
return i;
}
unsigned int binaryToUint(char *s) {
unsigned int i = 0;
int count = 0;
while (s[count])
i = (i << 1) | (s[count++] - '0');
return i;
}
char *intToBinary(int i); // 부호 있는 32비트 정수를, 2진수 문자열로 변환
char *uintToBinary(unsigned int i); // 부호 없는 32비트 정수를, 2진수 문자열로 변환
int binaryToInt(char *s); // 2진수 문자열을, 부호 있는 32비트 정수로 변환
unsigned int binaryToUint(char *s); // 2진수 문자열을, 부호 없는 32비트 정수로 변환
void main(void) {
puts("\n\nDecimal to Binary (int) :\n");
printf("%s\n", intToBinary(0x0));
printf("%s\n", intToBinary(0xFF));
printf("%s\n", intToBinary(0xFFFF));
printf("%s\n", intToBinary(-2147483647 - 1)); // int 최소값 = -2147483648
printf("%s\n", intToBinary(2147483647)); // int 최대값
printf("%s\n", intToBinary(639127054)); // 임의의 값
puts("\n\nDecimal to Binary (unsigned int) :\n");
printf("%s\n", uintToBinary(0x0));
printf("%s\n", uintToBinary(0xF));
printf("%s\n", uintToBinary(0xFF));
printf("%s\n", uintToBinary(0xFFFF));
printf("%s\n", uintToBinary(0xFFFFFFFF)); // unsigned int 최대값
puts("\n\nBinary to Decimal (int):");
printf("%d\n", binaryToInt("0"));
printf("%d\n", binaryToInt("1111"));
printf("%d\n", binaryToInt("11111111"));
printf("%d\n", binaryToInt("1111111111111111"));
printf("%d\n", binaryToInt("00000000000000001111111111111111"));
printf("%d\n", binaryToInt("01111111111111111111111111111111"));
puts("\n\nBinary to Decimal (unsigned int):");
printf("%u\n", binaryToUint("0"));
printf("%u\n", binaryToUint("1111"));
printf("%u\n", binaryToUint("11111111"));
printf("%u\n", binaryToUint("1111111111111111"));
printf("%u\n", binaryToUint("00000000000000001111111111111111"));
printf("%u\n", binaryToUint("11111111111111111111111111111111"));
printf("%u\n", binaryToUint("00100110000110000100111000001110"));
}
char *intToBinary(int i) {
static char s[32 + 1] = { '0', };
int count = 32;
do { s[--count] = '0' + (char) (i & 1);
i = i >> 1;
} while (count);
return s;
}
char *uintToBinary(unsigned int i) {
static char s[32 + 1] = { '0', };
int count = 32;
do { s[--count] = '0' + (char) (i & 1);
i = i >> 1;
} while (count);
return s;
}
int binaryToInt(char *s) {
int i = 0;
int count = 0;
while (s[count])
i = (i << 1) | (s[count++] - '0');
return i;
}
unsigned int binaryToUint(char *s) {
unsigned int i = 0;
int count = 0;
while (s[count])
i = (i << 1) | (s[count++] - '0');
return i;
}
실행 결과:
D:\Z>cl 0.cpp && 0.exe
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
0.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.
/out:0.exe
0.obj
Decimal to Binary (int) :
00000000000000000000000000000000
00000000000000000000000011111111
00000000000000001111111111111111
10000000000000000000000000000000
01111111111111111111111111111111
00100110000110000100111000001110
Decimal to Binary (unsigned int) :
00000000000000000000000000000000
00000000000000000000000000001111
00000000000000000000000011111111
00000000000000001111111111111111
11111111111111111111111111111111
Binary to Decimal (int):
0
15
255
65535
65535
2147483647
Binary to Decimal (unsigned int):
0
15
255
65535
65535
4294967295
639127054
D:\Z>
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
0.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.
/out:0.exe
0.obj
Decimal to Binary (int) :
00000000000000000000000000000000
00000000000000000000000011111111
00000000000000001111111111111111
10000000000000000000000000000000
01111111111111111111111111111111
00100110000110000100111000001110
Decimal to Binary (unsigned int) :
00000000000000000000000000000000
00000000000000000000000000001111
00000000000000000000000011111111
00000000000000001111111111111111
11111111111111111111111111111111
Binary to Decimal (int):
0
15
255
65535
65535
2147483647
Binary to Decimal (unsigned int):
0
15
255
65535
65535
4294967295
639127054
D:\Z>
printf("%s\n", intToBinary(-2147483648));
int 최소값인 -2147483648 을 직접 지정하면, warning C4146: unary minus operator applied to unsigned type, result still unsigned (부호 없는 정수형에, 마이너스 부호를 지정했다) 라는 경고가 나오기에,
printf("%s\n", intToBinary(-2147483647 - 1));
이런 식으로 표현했습니다.
intToBinary() 함수에서
static char s[32 + 1] = { '0', };
이것을 static 으로 하지 않으면, warning C4172: returning address of local variable or temporary 이런 워닝이 납니다. 지역 변수의 주소를 반환하려고 했다는 경고입니다. 지역 변수는 그 함수가 종료되면 자동으로 사라지기에 기껏 주소를 반환해도 "주막 없는 번지"가 되어 버립니다. static 변수로 만들면, 함수가 종료되어도 변수가 사라지지 않게 됩니다.
'Language > C' 카테고리의 다른 글
숫자를 문자열로 변환! (0) | 2009.12.09 |
---|---|
C언어에서 #ifdef와 #endef 의 뜻이 뭔가요? (0) | 2009.11.03 |
memmove() (0) | 2008.10.07 |
[일반]#pragma once 와 #pragma comment() (0) | 2008.07.08 |
[Programming] 정수형보다 큰수를 출력하구 싶어요~ (0) | 2008.04.03 |