컴퓨터 프로그래밍에서 꼭 알아두어야 할 주요 진법은 당연히 10진법, 2진법, 8진법, 16진법이다.
다음은 0 에서 15 까지의 정수를 10진법, 2진법, 8진법, 16진법의 표로 만들어 보여주는 F# 소스 코드이다. 진법 변환에 필요한 함수
atoi(string, radix)
itoa(number, radix)
를 F# 코드로 자체 작성하여 사용하였다.
(아래의 소스는 Python 소스를 F# 소스로 일대일 변환 수정한 것이라서, F# 언어의 명령형 언어 특징을 위주로 작성되어 있다.)
- (*
- * Filename: MakeRadixTable.fs
- * Show the radix table with 10-, 2-, 8-, 16-radices.
- *
- * Compile: fsc MakeRadixTable.fs
- * Execute: MakeRadixTable
- *
- * Date: 2010/07/15
- * Author: PH Kim [ pkim (AT) scripts.pe.kr ]
- *)
- #light
- exception RuntimeError of string
- exception ValueError of string
- let BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- let println s =
- printfn "%O" s
- let print s =
- printf "%O" s
- let printUsage dummy =
- println "Usage: MakeRadixTable"
- println "Show the radix table with 10-, 2-, 8-, 16-radices."
- let itoa (num : int, radix : int) =
- let mutable isNegative = false
- let mutable numx = num
- if num < 0 then
- isNegative <- true
- numx <- (-num)
- let mutable arr = [ ]
- let mutable q = numx
- let mutable r = 0
- while (q >= radix) do
- r <- int (q % radix)
- q <- int (q / radix)
- arr <- List.append arr [ sprintf "%O" (BASE36.[r]) ]
- arr <- List.append arr [ sprintf "%O" (BASE36.[q]) ]
- if isNegative then
- arr <- List.append arr [ "-" ]
- arr <- List.rev arr
- System.String.Join("", List.toArray arr)
- let atoi (s : string, radix : int) : int =
- let mutable ret = 0
- let mutable isNegative = false
- let len = s.Length
- let mutable valx = 0
- let mutable c = s.[0]
- if c = '-' then
- isNegative <- true
- elif (c >= '0' && c <= '9') then
- ret <- (int c) - (int '0')
- elif (c >= 'A' && c <= 'Z') then
- ret <- int c - int 'A' + 10
- elif (c >= 'a' && c <= 'z') then
- ret <- int c - int 'a' + 10
- if (ret >= radix) then
- printfn " Error: Can not read \"%s\" (as radix %d): %O is an invalid character!" s radix ret
- for i = 1 to len - 1 do
- c <- s.[i]
- ret <- ret*radix
- if (c >= '0' && c <= '9') then
- valx <- int c - int '0'
- elif (c >= 'A' && c <= 'Z') then
- valx <- int c - int 'A' + 10
- elif (c >= 'a' && c <= 'z') then
- valx <- int c - int 'a' + 10
- if (valx >= radix) then
- printfn " Error: Can not read \"%s\" (as radix %d): %O is an invalid character!" s radix c
- ret <- ret + valx
- if (isNegative) then
- ret <- (-ret )
- ret
- let makeTable dummy =
- let mutable sbuf = ""
- let mutable abuf = ""
- let mutable tbuf = ""
- for i in 0..(4-1) do
- sbuf <- sbuf + "+-------"
- sbuf <- sbuf + "+"
- println(sbuf)
- sbuf <- "| Dec"
- sbuf <- sbuf + "\t| Bin"
- sbuf <- sbuf + "\t| Oct"
- sbuf <- sbuf + "\t| Hex |"
- println(sbuf)
- sbuf <- ""
- for i in 0..(4-1) do
- sbuf <- sbuf + "+-------"
- sbuf <- sbuf + "+"
- println(sbuf)
- for i in 0..(16-1) do
- sbuf <- sprintf "| %2d" i
- abuf <- itoa(i, 2)
- tbuf <- sprintf "\t| %4s" abuf
- sbuf <- sbuf + tbuf
- abuf <- itoa(i, 8)
- tbuf <- sprintf "\t| %2s" abuf
- sbuf <- sbuf + tbuf
- abuf <- itoa(i, 16)
- tbuf <- sprintf "\t| %-2s |" abuf
- sbuf <- sbuf + tbuf
- println(sbuf)
- sbuf <- ""
- for i in 0..(4-1) do
- sbuf <- sbuf + "+-------"
- sbuf <- sbuf + "+"
- println(sbuf)
- // Begin here
- let cmdArgs = System.Environment.GetCommandLineArgs()
- if (Array.length cmdArgs > 1 && "-h" = cmdArgs.[1]) then
- printUsage 0
- exit(1)
- makeTable 0
컴파일> fsc MakeRadixTable.fs
실행> MakeRadixTable
+-------+-------+-------+-------+ | 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 | +-------+-------+-------+-------+
'프로그래밍 > F#' 카테고리의 다른 글
손으로 만드는 나눗셈 계산표 with F# (0) | 2010.07.15 |
---|---|
7비트 ASCII 코드표 만들기 예제 with F# (0) | 2010.07.15 |
대화형 모드의 진법(radix) 변환 예제 with F# (0) | 2010.07.14 |
황금비율(golden ratio) 구하기 with F# (0) | 2010.07.13 |
현재 시각 알아내기 for F# (0) | 2010.07.13 |