컴퓨터 프로그래밍에서 꼭 알아두어야 할 주요 진법은 당연히 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 코드로 자체 작성하여 사용하였다.
- /*
- * Filename: makeRadixTable.groovy
- * Show the radix table with 10-, 2-, 8-, 16-radices.
- *
- * Execute: groovy makeRadixTable.groovy
- *
- * Date: 2008/03/28
- * Author: PH Kim [ pkim (AT) scripts.pe.kr ]
- */
- def printUsage() {
- println("Usage: groovy makeRadixTable.groovy")
- println("Show the radix table with 10-, 2-, 8-, 16-radices.")
- }
- def convertItoA(long num, int radix) {
- String BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- long q, r
- boolean isNegative = false
- if (num < 0) {
- isNegative = true
- num = -num
- }
- def arr = ""
- q = num
- r = 0
- while (q >= radix) {
- r = q % radix
- q = q / radix
- arr += BASE36[(int) r]
- }
- arr += BASE36[(int) q]
- if (isNegative) {
- arr += "-"
- }
- int n = arr.length()
- def ret = ""
- for (i = 0; i < n; i++) {
- ret += arr[n - i - 1]
- }
- return ret
- }
- def convertAtoI(String srcStr, int radix) {
- String BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- boolean isNegative = false
- long ret = 0L
- int len = srcStr.length()
- String c
- int i
- long val = 0L
- c = srcStr[0]
- if (c == '-') {
- isNegative = true
- }
- else if (c >= '0' && c <= '9') {
- ret = (long) (c.charAt(0) - '0'.charAt(0))
- }
- else if (c >= 'A' && c <= 'Z') {
- ret = (long) (c.charAt(0) - 'A'.charAt(0)) + 10L
- }
- else if (c >= 'a' && c <= 'z') {
- ret = (long) (c.charAt(0) - 'a'.charAt(0)) + 10L
- }
- if (ret >= (long) radix) {
- println(" Invalid character!")
- return ret
- }
- for (i = 1; i < len; i++) {
- c = srcStr[i]
- ret *= radix
- if (c >= '0' && c <= '9') {
- val = (long) (c.charAt(0) - '0'.charAt(0))
- }
- else if (c >= 'A' && c <= 'Z') {
- val = (long) (c.charAt(0) - 'A'.charAt(0)) + 10L
- }
- else if (c >= 'a' && c <= 'z') {
- val = (long) (c.charAt(0) - 'a'.charAt(0)) + 10L
- }
- if (val >= (long) radix) {
- println(" Invalid character!")
- return ret
- }
- ret += val
- }
- return ret
- }
- def makeTable() {
- String sbuf = ""
- String abuf = ""
- String tbuf = ""
- int i, j
- char c;
- 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++) {
- sbuf = String.format("| %2d", i)
- abuf = convertItoA((long) i, 2)
- tbuf = String.format("\t| %4s", abuf)
- sbuf += tbuf
- abuf = convertItoA((long) i, 8)
- tbuf = String.format("\t| %2s", abuf)
- sbuf += tbuf
- abuf = convertItoA((long) i, 16)
- tbuf = String.format("\t| %-2s |", abuf)
- sbuf += tbuf
- println(sbuf)
- }
- for (i = 0; i < 4; i++) {
- print("+-------")
- }
- print("+")
- println("")
- }
- if (args.length > 0 && "-h".equals(args[0])) {
- printUsage()
- System.exit(1);
- }
- 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 | +-------+-------+-------+-------+
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
'프로그래밍 > Groovy' 카테고리의 다른 글
Scanner 클래스를 이용한 웹 텍스트 문서 읽기 Groovy 예제 (0) | 2008.03.31 |
---|---|
7비트 ASCII 코드표 만들기 예제 with Groovy (0) | 2008.03.31 |
대화형 모드의 진법(radix) 변환 예제 with Groovy (0) | 2008.03.28 |
황금비율(golden ratio) 구하기 with Groovy (0) | 2008.03.24 |
현재 시각 알아내기 for Groovy (0) | 2008.03.24 |