컴퓨터 프로그래밍에서 꼭 알아두어야 할 주요 진법은 당연히 10진법, 2진법, 8진법, 16진법이다.
다음은 0 에서 15 까지의 정수를 10진법, 2진법, 8진법, 16진법의 표로 만들어 보여주는 Io 소스 코드이다. 진법 변환에 필요한 Io 메소드로
string fromBase(radix)
string toBase(radix)
가 이미 있지만, 여기에 준하는 메소드
convertAtoI(string, radix)
convertItoA(int, radix)
를 Io 코드로 자체 작성하여 사용하였다.
- /*
- * Filename: makeRadixTable.io
- * Show the radix table with 10-, 2-, 8-, 16-radices.
- *
- * Execute: io makeRadixTable.io
- *
- * Date: 2008/05/01
- * Author: PH Kim [ pkim (AT) scripts.pe.kr ]
- */
- printUsage := method(
- "Usage: io makeRadixTable.io" println
- "Show the radix table with 10-, 2-, 8-, 16-radices." println
- )
- convertItoA := method(num, radix,
- BASE36 := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- q := 0
- r := 0
- isNegative := false
- if (num < 0) then (
- isNegative = true
- num = -num
- )
- arr := ""
- q = num
- r = 0
- while (q >= radix,
- r = q % radix
- q = (q / radix) floor
- arr = arr .. (BASE36 slice(r, r + 1))
- )
- arr = arr .. (BASE36 slice(q, q + 1))
- if (isNegative) then (
- arr = "-" .. arr
- )
- n := arr size
- ret := ""
- for (i, 0, n - 1,
- ret = ret .. arr slice(n - i - 1, n - i)
- )
- return ret
- )
- convertAtoI := method(srcStr, radix,
- BASE36 := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- isNegative := false
- ret := 0
- len := srcStr size
- c := ""
- i := 0
- val := 0
- c = srcStr at(0)
- if (c == "-") then (
- isNegative = true
- ) elseif (c >= "0" and c <= "9") then (
- ret = (c product) - ("0" product)
- ) elseif (c >= "A" and c <= "Z") then (
- ret = (c product) - ("A" product) + 10
- ) elseif (c >= "a" and <= "z") then (
- ret = (c product) - ("a" product) + 10
- )
- if (ret >= adix) then (
- " Invalid character!" println
- return ret
- )
- for (i, 1, len - 1,
- c = srcStr[i]
- ret = ret * radix
- if (c >= "0" and c <= "9") then (
- val = c product - "0" product
- ) elseif (c >= 'A' and c <= 'Z') then (
- val = c product - "A" product + 10
- ) elseif (c >= 'a' and c <= 'z') then (
- val = c product - "a" product + 10
- )
- if (val >= (long) radix) then (
- " Invalid character!" println
- return ret
- )
- ret = ret + val
- )
- return ret
- )
- makeTable := method(
- sbuf := ""
- abuf := ""
- tbuf := ""
- i := 0
- j := 0
- c := ""
- for (i, 0, 3,
- )
- "" println
- "| Dec" print
- "\t| Bin" print
- "\t| Oct" print
- "\t| Hex |" print
- "" println
- for (i, 0, 3,
- )
- "" println
- for (i, 0, 15,
- strI := i asString
- if (strI size < 2) then (strI = (" " repeated(2 - (strI size))) .. strI)
- sbuf = "| " .. strI
- abuf = convertItoA(i, 2)
- strA := abuf
- if (strA size < 4) then (strA = " " repeated(4 - strA size) .. strA)
- tbuf = "\t| " .. strA
- sbuf = sbuf .. tbuf
- abuf = convertItoA(i, 8)
- strA = abuf
- if (strA size < 2) then (strA = " " repeated(2 - strA size) .. strA)
- tbuf = "\t| " .. strA
- sbuf = sbuf .. tbuf
- abuf = convertItoA(i, 16)
- strA = abuf
- if (strA size < 2) then (strA = " " repeated(2 - strA size) .. strA)
- tbuf = "\t| " .. strA
- sbuf = sbuf .. tbuf .. " |"
- sbuf println
- )
- for (i, 0, 3,
- )
- "" println
- )
- if (args size > 1 and "-h" == args at(1)) then (
- printUsage()
- exit(1)
- )
- makeTable()
실행> io makeRadixTable.io
+-------+-------+-------+-------+ | 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 대한민국 라이센스에 따라 이용하실 수 있습니다.
'프로그래밍 > Io' 카테고리의 다른 글
삼각형 출력 예제를 통한 여러 가지 소스 비교 with Io (0) | 2008.05.02 |
---|---|
7비트 ASCII 코드표 만들기 예제 with Io (0) | 2008.05.02 |
대화형 모드의 진법(radix) 변환 예제 with Io (0) | 2008.04.30 |
황금비율(golden ratio) 구하기 with Io (0) | 2008.04.15 |
현재 시각 알아내기 for Io (0) | 2008.04.07 |