컴퓨터 프로그래밍에서 꼭 알아두어야 할 주요 진법은 당연히 10진법, 2진법, 8진법, 16진법이다.
다음은 0 에서 15 까지의 정수를 10진법, 2진법, 8진법, 16진법의 표로 만들어 보여주는 Go 언어 소스 코드이다. 진법 변환에 필요한 함수
convertAtoI(string, radix)
convertItoA(int64, radix)
를 Go 언어 코드로 자체 작성하여 사용하였다.
- /*
- * Filename: makeRadixTable.go
- * Show the radix table with 10-, 2-, 8-, 16-radices.
- *
- * Execute: go run makeRadixTable.go
- *
- * or
- *
- * Compile: go build makeRadixTable.go
- * Execute: ./makeRadixTable
- *
- * Date: 2012/06/25
- * Author: PH Kim [ pkim (AT) scripts.pe.kr ]
- */
- package main
- import (
- "fmt"
- "os"
- )
- type _TOKEN struct {
- a string
- b string
- }
- func println(s string) {
- fmt.Printf("%s\n", s)
- }
- func print(s string) {
- fmt.Printf("%s", s)
- }
- func printUsage() {
- println("Usage: makeRadixTable")
- println("Show the radix table with 10-, 2-, 8-, 16-radices.")
- }
- func convertItoA(num int64, radix int) (ret string) {
- var BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- var tmp string
- var arr string
- var q, r int64
- var i, n int
- var isNegative bool = false
- if num < 0 {
- isNegative = true
- num = -num
- }
- arr = ""
- q = num
- r = 0
- for q >= int64(radix) {
- r = q % int64(radix)
- q = q / int64(radix)
- tmp = BASE36[r:r+1]
- arr += tmp
- }
- tmp = BASE36[q:q+1]
- arr += tmp
- if isNegative {
- arr += "-"
- }
- n = len(arr)
- for i = 0; i < n; i++ {
- ret += arr[n - i - 1:n-i]
- }
- return ret
- }
- func convertAtoI(str string, radix int) (ret int64) {
- var isNegative bool = false
- var len int = len(str)
- var c byte
- var i int
- var val int64
- c = str[0]
- if c == '-' {
- isNegative = true
- } else if c >= '0' && c <= '9' {
- ret = int64(c) - int64('0');
- } else if c >= 'A' && c <= 'Z' {
- ret = int64(c - 'A') + 10
- } else if c >= 'a' && c <= 'z' {
- ret = int64(c - 'a') + 10;
- }
- if ret >= int64(radix) {
- println(" Invalid character!")
- return ret
- }
- for i = 1; i < len; i++ {
- c = str[i]
- ret *= int64(radix)
- if c >= '0' && c <= '9' {
- val = int64(c - '0')
- } else if c >= 'A' && c <= 'Z' {
- val = int64(c - 'A') + 10
- } else if c >= 'a' && c <= 'z' {
- val = int64(c - 'a') + 10
- }
- if val >= int64(radix) {
- println(" Invalid character!")
- return ret
- }
- ret += val
- }
- if isNegative {
- ret = -ret
- }
- return ret
- }
- func makeTable() {
- var sbuf, abuf, tbuf string
- var i int
- 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 = fmt.Sprintf("| %2d", i)
- abuf = convertItoA(int64(i), 2)
- tbuf = fmt.Sprintf("\t| %4s", abuf)
- sbuf += tbuf
- abuf = convertItoA(int64(i), 8)
- tbuf = fmt.Sprintf("\t| %2s", abuf)
- sbuf += tbuf
- abuf = convertItoA(int64(i), 16)
- tbuf = fmt.Sprintf("\t| %-2s |", abuf)
- sbuf += tbuf
- println(sbuf)
- }
- for i = 0; i < 4; i++ {
- print("+-------");
- }
- print("+")
- println("")
- }
- func main() {
- if len(os.Args) > 1 && os.Args[1] == "-h" {
- printUsage()
- os.Exit(1)
- }
- makeTable()
- }
실행> go run akeRadixTable.go
컴파일> go build makeRadixTable.go
실행> ./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 | +-------+-------+-------+-------+
'프로그래밍 > Go' 카테고리의 다른 글
삼각형 출력 예제를 통한 여러 가지 소스 비교 with Go (0) | 2012.06.26 |
---|---|
7비트 ASCII 코드표 만들기 예제 with Go (0) | 2012.06.25 |
대화형 모드의 진법(radix) 변환 예제 with Go (0) | 2012.06.22 |
황금비율(golden ratio) 구하기 with Go (0) | 2012.06.20 |
Go 프로그램 언어로 긴 자리 정수 계산하기 (0) | 2012.06.18 |