Есть более быстрый способ сделать это, использующий преимущество string.format, который преобразует числа в основание 8. Затем тривиально преобразовать основание 8 в двоичное.
--create lookup table for octal to binary
oct2bin = {
['0'] = '000',
['1'] = '001',
['2'] = '010',
['3'] = '011',
['4'] = '100',
['5'] = '101',
['6'] = '110',
['7'] = '111'
}
function getOct2bin(a) return oct2bin[a] end
function convertBin(n)
local s = string.format('%o', n)
s = s:gsub('.', getOct2bin)
return s
end
Если вы хотите, чтобы все они были одинакового размера, тогда сделайте
s = string.format('%.22o', n)
Что дает тебе 66 битов. Это два дополнительных бита в конце, так как восьмеричное работает в группах по 3 бита, а 64 не делится на 3. Если вы хотите 33 бита, измените его на 11.
Если у вас есть библиотека BitOp , которая по умолчанию доступна в LuaJIT, то вы можете сделать это:
function convertBin(n)
local t = {}
for i = 1, 32 do
n = bit.rol(n, 1)
table.insert(t, bit.band(n, 1))
end
return table.concat(t)
end
Но учтите, что это только первые 32 бита! Если ваше число больше 2 ^ 32, результат не будет правильным.