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

         Integer.parseInt(String, int radix);
         Long.toString(long, int radix);

가 이미 있지만, 여기에 준하는 함수

        convertAtoI(String, radix)
        convertItoA(long, radix)

를 Groovy 코드로 자체 작성하여 사용하였다.



  1. /*
  2.  *  Filename: makeRadixTable.groovy
  3.  *            Show the radix table with 10-, 2-, 8-, 16-radices.
  4.  *
  5.  *  Execute: groovy makeRadixTable.groovy
  6.  *
  7.  *      Date:  2008/03/28
  8.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  9.  */
  10. def printUsage() {
  11.     println("Usage: groovy makeRadixTable.groovy")
  12.     println("Show the radix table with 10-, 2-, 8-, 16-radices.")
  13. }
  14. def convertItoA(long num, int radix) {
  15.     String BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  16.     long q, r
  17.     boolean isNegative = false
  18.     if (num < 0) {
  19.         isNegative = true
  20.         num = -num
  21.     }
  22.     def arr = ""
  23.     q = num
  24.     r = 0
  25.     while (q >= radix) {
  26.         r = q % radix
  27.         q = q / radix
  28.         arr += BASE36[(int) r]
  29.      }
  30.      arr += BASE36[(int) q]
  31.      if (isNegative) {
  32.          arr += "-"
  33.      }
  34.      int n = arr.length()
  35.      def ret = ""
  36.      for (i = 0; i < n; i++) {
  37.          ret += arr[n - i - 1]
  38.      }
  39.      return ret
  40. }
  41. def convertAtoI(String srcStr, int radix) {
  42.     String BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  43.     boolean isNegative = false
  44.     long ret = 0L
  45.     int len = srcStr.length()
  46.     String c
  47.     int i
  48.     long val = 0L
  49.     c = srcStr[0]
  50.     if (c == '-') {
  51.         isNegative = true
  52.     }
  53.     else if (c >= '0' && c <= '9') {
  54.         ret = (long) (c.charAt(0) - '0'.charAt(0))
  55.     }
  56.     else if (c >= 'A' && c <= 'Z') {
  57.         ret = (long) (c.charAt(0) - 'A'.charAt(0)) + 10L
  58.     }
  59.     else if (c >= 'a' && c <= 'z') {
  60.         ret = (long) (c.charAt(0) - 'a'.charAt(0)) + 10L
  61.     }
  62.     if (ret >= (long) radix) {
  63.         println("        Invalid character!")
  64.         return ret
  65.     }
  66.     for (i = 1; i < len; i++) {
  67.         c = srcStr[i]
  68.         ret *= radix
  69.         if (c >= '0' && c <= '9') {
  70.             val = (long) (c.charAt(0) - '0'.charAt(0))
  71.         }
  72.         else if (c >= 'A' && c <= 'Z') {
  73.             val = (long) (c.charAt(0) - 'A'.charAt(0)) + 10L
  74.         }
  75.         else if (c >= 'a' && c <= 'z') {
  76.             val = (long) (c.charAt(0) - 'a'.charAt(0)) + 10L
  77.         }
  78.         if (val >= (long) radix) {
  79.             println("        Invalid character!")
  80.             return ret
  81.         }
  82.         ret += val
  83.     }
  84.     return ret
  85. }
  86. def makeTable() {
  87.     String sbuf = ""
  88.     String abuf = ""
  89.     String tbuf = ""
  90.     int i, j
  91.     char c;
  92.     for (i = 0; i < 4; i++) {
  93.         print("+-------")
  94.     }
  95.     print("+")
  96.     println("")
  97.     print("|  Dec")
  98.     print("\t|   Bin")
  99.     print("\t|  Oct")
  100.     print("\t|  Hex  |")
  101.     println("")
  102.     for (i = 0; i < 4; i++) {
  103.         print("+-------")
  104.     }
  105.     print("+")
  106.     println("")
  107.     for (i = 0; i < 16; i++) {
  108.         sbuf = String.format("|   %2d", i)
  109.         abuf = convertItoA((long) i, 2)
  110.         tbuf = String.format("\t|  %4s", abuf)
  111.         sbuf += tbuf
  112.         abuf = convertItoA((long) i, 8)
  113.         tbuf = String.format("\t|   %2s", abuf)
  114.         sbuf += tbuf
  115.         abuf = convertItoA((long) i, 16)
  116.         tbuf = String.format("\t|    %-2s |", abuf)
  117.         sbuf += tbuf
  118.         println(sbuf)
  119.     }
  120.     for (i = 0; i < 4; i++) {
  121.         print("+-------")
  122.     }
  123.     print("+")
  124.     println("")
  125. }
  126. if (args.length > 0 && "-h".equals(args[0])) {
  127.     printUsage()
  128.     System.exit(1);
  129. }
  130. makeTable()



실행> groovy makeRadixTable.groovy

+-------+-------+-------+-------+
|  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  |
+-------+-------+-------+-------+




Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
Posted by Scripter
,