Lua: вывести целое число в двоичном виде - PullRequest
11 голосов
/ 31 января 2012

Как я могу представить целое число в двоичном виде?

, чтобы я мог напечатать 7 как 111

Ответы [ 5 ]

8 голосов
/ 31 января 2012

Вы пишете функцию для этого.

num=7
function toBits(num)
    -- returns a table of bits, least significant first.
    local t={} -- will contain the bits
    while num>0 do
        rest=math.fmod(num,2)
        t[#t+1]=rest
        num=(num-rest)/2
    end
    return t
end
bits=toBits(num)
print(table.concat(bits))

В Lua 5.2 у вас уже есть побитовые функции, которые могут вам помочь ( bit32 )


Вот наиболее значимая первая версия с необязательным заполнением нуля до указанного числа битов:

function toBits(num,bits)
    -- returns a table of bits, most significant first.
    bits = bits or math.max(1, select(2, math.frexp(num)))
    local t = {} -- will contain the bits        
    for b = bits, 1, -1 do
        t[b] = math.fmod(num, 2)
        num = math.floor((num - t[b]) / 2)
    end
    return t
end
3 голосов
/ 18 марта 2014
function bits(num)
    local t={}
    while num>0 do
        rest=num%2
        table.insert(t,1,rest)
        num=(num-rest)/2
    end return table.concat(t)
end

Так как никто не хочет использовать table.insert, пока он здесь полезен

2 голосов
/ 26 августа 2015

Есть более быстрый способ сделать это, использующий преимущество 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, результат не будет правильным.

2 голосов
/ 02 ноября 2014

Вот функция, вдохновленная принятым ответом с правильным синтаксисом, которая возвращает таблицу битов, написанную справа налево.

num=255
bits=8
function toBits(num, bits)
    -- returns a table of bits
    local t={} -- will contain the bits
    for b=bits,1,-1 do
        rest=math.fmod(num,2)
        t[b]=rest
        num=(num-rest)/2
    end
    if num==0 then return t else return {'Not enough bits to represent this number'}end
end
bits=toBits(num, bits)
print(table.concat(bits))

>>11111111
0 голосов
/ 31 января 2012
function reverse(t)
  local nt = {} -- new table
  local size = #t + 1
  for k,v in ipairs(t) do
    nt[size - k] = v
  end
  return nt
end

function tobits(num)
    local t={}
    while num>0 do
        rest=num%2
        t[#t+1]=rest
        num=(num-rest)/2
    end
    t = reverse(t)
    return table.concat(t)
end
print(tobits(7))
# 111
print(tobits(33))
# 100001
print(tobits(20))
# 10100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...