-- Literals: decimal, hex; no octal, no 0b
local decimal = 42
local hexadecimal = 0x42
-- hexadecimal = 66
-- Trap: a leading zero is still decimal
local octal_literal = 042
-- octal_literal = 42
-- To hex and octal strings
local s_hexadecimal = string.format("%x", decimal)
-- s_hexadecimal = 2a
local s_octal = string.format("%o", decimal)
-- s_octal = 52
-- No format for binary: collect the bits
local function to_binary(n)
local bits = {}
repeat
bits[#bits + 1] = n % 2
n = n // 2
until n == 0
return table.concat(bits):reverse()
end
local s_binary = to_binary(decimal)
-- s_binary = 101010
-- A string in any base 2..36 back to int
local from_hexadecimal = tonumber("2a", 16)
-- from_hexadecimal = 42
local from_octal = tonumber("52", 8)
-- from_octal = 42
local from_binary = tonumber("101010", 2)
-- from_binary = 42
-- Without a base the 0x prefix decides
local from_prefix = tonumber("0x2a")
-- from_prefix = 42
print("hexadecimal = " .. hexadecimal)
print("octal_literal = " .. octal_literal)
print("s_hexadecimal = " .. s_hexadecimal)
print("s_octal = " .. s_octal)
print("s_binary = " .. s_binary)
print("from_hexadecimal = " .. from_hexadecimal)
print("from_octal = " .. from_octal)
print("from_binary = " .. from_binary)
print("from_prefix = " .. from_prefix)