컴퓨터 프로그래밍에서 꼭 알아두어야 할 주요 진법은 당연히 10진법, 2진법, 8진법, 16진법이다.
다음은 0 에서 15 까지의 정수를 10진법, 2진법, 8진법, 16진법의 표로 만들어 보여주는 Ruby 소스 코드이다. 진법 변환에 필요한 함수
convertAtoI(string, radix)
convertItoA(number, radix)
를 Ruby 코드로 자체 작성하여 사용하였다.
(아래의 소스는 JRuby로 실행시켜도 된다.)
- # Filename: makeRadixTable.rb
- # Show the radix table with 10-, 2-, 8-, 16-radices.
- #
- # Execute: ruby makeRadixTable.rb
- #
- # Date: 2008/03/28
- # Author: PH Kim [ pkim (AT) scripts.pe.kr ]
- BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- def println(s=nil)
- if s == nil
- print("\n")
- else
- print("%s\n" % s)
- end
- end
- def printUsage()
- println("Usage: ruby makeRadixTable.rb")
- println("Show the radix table with 10-, 2-, 8-, 16-radices.")
- end
- def convertItoA(num, radix)
- isNegative = false
- if num < 0
- isNegative = true
- num = -num
- end
- arr = ""
- q = num
- r = 0
- while q >= radix
- r = q % radix
- q = q / radix
- arr = arr + BASE36[r..r]
- end
- arr = arr + BASE36[q..q]
- if isNegative
- arr = arr + "-"
- end
- n = arr.length
- ret = ""
- for i in 0...n
- ret = ret + arr[(n - i - 1)..(n - i - 1)]
- end
- return ret
- end
- def convertAtoI(srcStr, radix)
- isNegative = false
- ret = 0
- len = srcStr.length
- val = 0
- c = srcStr[0..0]
- if c == '-'
- isNegative = true
- elsif c >= '0' and c <= '9'
- ret = c[0] - '0'[0]
- elsif c >= 'A' and c <= 'Z'
- ret = (c[0] - 'A'[0]) + 10
- elsif c >= 'a' and c <= 'z'
- ret = (c[0] - 'a'[0]) + 10
- end
- if ret >= radix
- println(" Invalid character!")
- return ret
- end
- for i in 1...len
- c = srcStr[i..i]
- ret = ret * radix
- if c >= '0' and c <= '9'
- val = c[0] - '0'[0]
- elsif c >= 'A' and c <= 'Z'
- val = (c[0] - 'A'[0]) + 10
- elsif c >= 'a' and c <= 'z'
- val = (c[0] - 'a'[0]) + 10
- end
- if val >= radix
- println(" Invalid character!")
- return ret
- end
- ret = ret + val
- end
- return ret
- end
- def makeTable()
- sbuf = ""
- abuf = ""
- tbuf = ""
- for i in 0...4
- sbuf += "+-------"
- end
- sbuf += "+"
- println(sbuf)
- sbuf = "| Dec"
- sbuf += "\t| Bin"
- sbuf += "\t| Oct"
- sbuf += "\t| Hex |"
- println(sbuf)
- sbuf = ""
- for i in 0...4
- sbuf += "+-------"
- end
- sbuf += "+"
- println(sbuf)
- for i in 0...16
- sbuf = "| %2d" % i
- abuf = convertItoA(i, 2)
- tbuf = "\t| %4s" % abuf
- sbuf += tbuf
- abuf = convertItoA(i, 8)
- tbuf = "\t| %2s" % abuf
- sbuf += tbuf
- abuf = convertItoA(i, 16)
- tbuf = "\t| %-2s |" % abuf
- sbuf += tbuf
- println(sbuf)
- end
- sbuf = ""
- for i in 0...4
- sbuf += "+-------"
- end
- sbuf += "+"
- println(sbuf)
- end
- if ARGV.length > 0 and "-h" == ARGV[0]
- printUsage()
- exit(1)
- end
- 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 | +-------+-------+-------+-------+
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
'프로그래밍 > Ruby' 카테고리의 다른 글
삼각형 출력 예제를 통한 여러 가지 소스 비교 with Ruby (0) | 2008.04.05 |
---|---|
7비트 ASCII 코드표 만들기 예제 with Ruby (0) | 2008.03.31 |
대화형 모드의 진법(radix) 변환 예제 with Ruby (0) | 2008.03.28 |
황금비율(golden ratio) 구하기 with Ruby or JRuby (0) | 2008.03.24 |
현재 시각 알아내기 for Ruby and JRuby (0) | 2008.03.24 |