Системы счисления

Простые типы / Числа / Integer

-- 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)