컴퓨터 프로그래밍에서 꼭 알아두어야 할 주요 진법은 당연히 10진법, 2진법, 8진법, 16진법이다.
다음은 0 에서 15 까지의 정수를 10진법, 2진법, 8진법, 16진법의 표로 만들어 보여주는 C 소스 코드이다. 진법 변환에 필요한 함수
convertAtoI(string, radix)
convertItoA(long, radix)
를 C 코드로 자체 작성하여 사용하였다.
(Ch를 사용하면 컴파일 과정 없이 소스 코드를 그대로 실행시킬 수 있다.)
- /*
- * Filename: makeRadixTable.c
- * Show the radix table with 10-, 2-, 8-, 16-radices.
- *
- * Compile: cl makeRadixTable.c
- * Execute: makeRadixTable
- *
- * Date: 2008/03/27
- * Author: PH Kim [ pkim (AT) scripts.pe.kr ]
- */
- #include <stdio.h>
- #include <string.h>
- #include <math.h>
- #define MAX_BUF 81
- enum { FALSE, TRUE };
- void println(char s[]) {
- printf("%s\n", s);
- }
- void print(char s[]) {
- printf("%s", s);
- }
- void printUsage() {
- println("Usage: makeRadixTable");
- println("Show the radix table with 10-, 2-, 8-, 16-radices.");
- }
- char BASE36[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- void convertItoA(char *pstr, long num, int radix) {
- char tmp[2];
- char ret[MAX_BUF];
- char arr[MAX_BUF];
- long q, r;
- int i, n;
- int isNegative = FALSE;
- if (num < 0L) {
- isNegative = TRUE;
- num = -num;
- }
- arr[0] = '\0';
- q = num;
- r = 0L;
- while (q >= (long) radix) {
- r = q % (long) radix;
- q = q / (long) radix;
- tmp[0] = BASE36[r];
- tmp[1] = '\0';
- strcat(arr, tmp);
- }
- tmp[0] = BASE36[q];
- tmp[1] = '\0';
- strcat(arr, tmp);
- if (isNegative) {
- strcat(arr, "-");
- }
- n = strlen(arr);
- for (i = 0; i < n; i++) {
- ret[i] = arr[n - i - 1];
- }
- ret[n] = '\0';
- strcpy(pstr, (char *) ret);
- }
- long convertAtoI(const char *pstr, int radix) {
- char tmp[2];
- long ret = 0L;
- char arr[MAX_BUF];
- long q, r;
- int isNegative = FALSE;
- int len = strlen(pstr);
- char c;
- int i;
- long val;
- c = pstr[0];
- if (c == '-') {
- isNegative = TRUE;
- }
- else if (c >= '0' && c <= '9') {
- ret = (long) (c - '0');
- }
- else if (c >= 'A' && c <= 'Z') {
- ret = (long) (c - 'A') + 10L;
- }
- else if (c >= 'a' && c <= 'z') {
- ret = (long) (c - 'a') + 10L;
- }
- if (ret >= (long) radix) {
- println(" Invalid character!");
- return ret;
- }
- for (i = 1; i < len; i++) {
- c = pstr[i];
- ret *= radix;
- if (c >= '0' && c <= '9') {
- val = (long) (c - '0');
- }
- else if (c >= 'A' && c <= 'Z') {
- val = (long) (c - 'A') + 10L;
- }
- else if (c >= 'a' && c <= 'z') {
- val = (long) (c - 'a') + 10L;
- }
- if (val >= (long) radix) {
- println(" Invalid character!");
- return ret;
- }
- ret += val;
- }
- return ret;
- }
- void makeTable() {
- char sbuf[MAX_BUF];
- char abuf[MAX_BUF/2];
- char tbuf[MAX_BUF/2];
- int i;
- for (i = 0; i < 4; i++) {
- print("+-------");
- }
- print("+");
- println("");
- print("| Dec");
- print("\t| Bin");
- print("\t| Oct");
- print("\t| Hex |");
- println("");
- for (i = 0; i < 4; i++) {
- print("+-------");
- }
- print("+");
- println("");
- for (i = 0; i < 16; i++) {
- sprintf(sbuf, "| %2d", i);
- convertItoA((char *)abuf, (long) i, 2);
- sprintf(tbuf, "\t| %4s", abuf);
- strcat(sbuf, tbuf);
- convertItoA((char *)abuf, (long) i, 8);
- sprintf(tbuf, "\t| %2s", abuf);
- strcat(sbuf, tbuf);
- convertItoA((char *)abuf, (long) i, 16);
- sprintf(tbuf, "\t| %-2s |", abuf);
- strcat(sbuf, tbuf);
- println(sbuf);
- }
- for (i = 0; i < 4; i++) {
- print("+-------");
- }
- print("+");
- println("");
- }
- void main(int argc, char *argv[]) {
- if (argc > 1 && strcmp("-h", argv[1]) == 0) {
- printUsage();
- exit(1);
- }
- makeTable();
- }
컴파일> cl makeRadixTable.c
실행> makeRadixTable
+-------+-------+-------+-------+ | Dec | Bin | Oct | Hex | +-------+-------+-------+-------+ | 0 | 0 | 0 | 0 | | 1 | 1 | 1 | 1 | | 2 | 10 | 2 | 2 | | 3 | 11 | 3 | 3 | | 4 | 100 | 4 | 4 | | 5 | 101 | 5 | 5 | | 6 | 110 | 6 | 6 | | 7 | 111 | 7 | 7 | | 8 | 1000 | 10 | 8 | | 9 | 1001 | 11 | 9 | | 10 | 1010 | 12 | A | | 11 | 1011 | 13 | B | | 12 | 1100 | 14 | C | | 13 | 1101 | 15 | D | | 14 | 1110 | 16 | E | | 15 | 1111 | 17 | F | +-------+-------+-------+-------+
'프로그래밍 > C' 카테고리의 다른 글
삼각형 출력 예제를 통한 여러 가지 소스 비교 with C (0) | 2008.04.05 |
---|---|
7비트 ASCII 코드표 만들기 예제 with C and Ch (0) | 2008.03.31 |
대화형 모드의 진법(radix) 변환 예제 with C and Ch (0) | 2008.03.28 |
황금비율(golden ratio) 구하기 with C or Ch (0) | 2008.03.24 |
현재 시각 알아내기 for C and Ch (0) | 2008.03.24 |