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