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

        convertAtoI(string, radix)
        convertItoA(number, radix)

를 Ruby 코드로 자체 작성하여 사용하였다.
(아래의 소스는 JRuby로 실행시켜도 된다.)




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



실행> ruby makeRadixTable.rb

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