컴퓨터 프로그래밍에서 꼭 알아두어야 할 주요 진법은 당연히 10진법, 2진법, 8진법, 16진법이다.
다음은  0 에서 15 까지의 정수를 10진법, 2진법, 8진법, 16진법의 표로 만들어 보여주는 C 소스 코드이다. 진법 변환에 필요한 함수

        convertAtoI(string, radix)
        convertItoA(long, radix)

를 C 코드로 자체 작성하여 사용하였다.
(Ch를 사용하면 컴파일 과정 없이 소스 코드를 그대로 실행시킬 수 있다.)



  1. /*
  2.  *  Filename: makeRadixTable.c
  3.  *            Show the radix table with 10-, 2-, 8-, 16-radices.
  4.  *
  5.  *  Compile: cl makeRadixTable.c
  6.  *  Execute: makeRadixTable
  7.  *
  8.  *      Date:  2008/03/27
  9.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  10.  */
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <math.h>
  14. #define MAX_BUF 81
  15. enum { FALSE, TRUE };
  16. void println(char s[]) {
  17.     printf("%s\n", s);
  18. }
  19. void print(char s[]) {
  20.     printf("%s", s);
  21. }
  22. void printUsage() {
  23.     println("Usage: makeRadixTable");
  24.     println("Show the radix table with 10-, 2-, 8-, 16-radices.");
  25. }
  26. char BASE36[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  27. void convertItoA(char *pstr, long num, int radix) {
  28.     char tmp[2];
  29.     char ret[MAX_BUF];
  30.     char arr[MAX_BUF];
  31.     long q, r;
  32.     int i, n;
  33.     int isNegative = FALSE;
  34.     if (num < 0L) {
  35.         isNegative = TRUE;
  36.         num = -num;
  37.     }
  38.     arr[0] = '\0';
  39.     q = num;
  40.     r = 0L;
  41.     while (q >= (long) radix) {
  42.         r = q % (long) radix;
  43.         q = q / (long) radix;
  44.         tmp[0] = BASE36[r];
  45.         tmp[1] = '\0';
  46.         strcat(arr, tmp);
  47.     }
  48.     tmp[0] = BASE36[q];
  49.     tmp[1] = '\0';
  50.     strcat(arr, tmp);
  51.     if (isNegative) {
  52.         strcat(arr, "-");
  53.     }
  54.     n = strlen(arr);
  55.     for (i = 0; i < n; i++) {
  56.         ret[i] = arr[n - i - 1];
  57.     }
  58.     ret[n] = '\0';
  59.     strcpy(pstr, (char *) ret);
  60. }
  61. long convertAtoI(const char *pstr, int radix) {
  62.     char tmp[2];
  63.     long ret = 0L;
  64.     char arr[MAX_BUF];
  65.     long q, r;
  66.     int isNegative = FALSE;
  67.     int len = strlen(pstr);
  68.     char c;
  69.     int i;
  70.     long val;
  71.     c = pstr[0];
  72.     if (c == '-') {
  73.        isNegative = TRUE;
  74.     }
  75.     else if (c >= '0' && c <= '9') {
  76.         ret = (long) (c - '0');
  77.     }
  78.     else if (c >= 'A' && c <= 'Z') {
  79.         ret = (long) (c - 'A') + 10L;
  80.     }
  81.     else if (c >= 'a' && c <= 'z') {
  82.         ret = (long) (c - 'a') + 10L;
  83.     }
  84.     if (ret >= (long) radix) {
  85.         println("        Invalid character!");
  86.         return ret;
  87.     }
  88.     for (i = 1; i < len; i++) {
  89.         c = pstr[i];
  90.         ret *= radix;
  91.         if (c >= '0' && c <= '9') {
  92.             val = (long) (c - '0');
  93.         }
  94.         else if (c >= 'A' && c <= 'Z') {
  95.             val = (long) (c - 'A') + 10L;
  96.         }
  97.         else if (c >= 'a' && c <= 'z') {
  98.             val = (long) (c - 'a') + 10L;
  99.         }
  100.         if (val >= (long) radix) {
  101.             println("        Invalid character!");
  102.             return ret;
  103.         }
  104.         ret += val;
  105.     }
  106.     return ret;
  107. }
  108. void makeTable() {
  109.     char sbuf[MAX_BUF];
  110.     char abuf[MAX_BUF/2];
  111.     char tbuf[MAX_BUF/2];
  112.     int i;
  113.     for (i = 0; i < 4; i++) {
  114.         print("+-------");
  115.     }
  116.     print("+");
  117.     println("");
  118.     print("|  Dec");
  119.     print("\t|   Bin");
  120.     print("\t|  Oct");
  121.     print("\t|  Hex  |");
  122.     println("");
  123.     for (i = 0; i < 4; i++) {
  124.         print("+-------");
  125.     }
  126.     print("+");
  127.     println("");
  128.     for (i = 0; i < 16; i++) {
  129.         sprintf(sbuf, "|   %2d", i);
  130.         convertItoA((char *)abuf, (long) i, 2);
  131.         sprintf(tbuf, "\t|  %4s", abuf);
  132.         strcat(sbuf, tbuf);
  133.         convertItoA((char *)abuf, (long) i, 8);
  134.         sprintf(tbuf, "\t|   %2s", abuf);
  135.         strcat(sbuf, tbuf);
  136.         convertItoA((char *)abuf, (long) i, 16);
  137.         sprintf(tbuf, "\t|    %-2s |", abuf);
  138.         strcat(sbuf, tbuf);
  139.         println(sbuf);
  140.     }
  141.     for (i = 0; i < 4; i++) {
  142.         print("+-------");
  143.     }
  144.     print("+");
  145.     println("");
  146. }
  147. void main(int argc, char *argv[]) {
  148.     if (argc > 1 && strcmp("-h", argv[1]) == 0) {
  149.         printUsage();
  150.         exit(1);
  151.     }
  152.     makeTable();
  153. }



컴파일> 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  |
+-------+-------+-------+-------+



 

Posted by Scripter
,