Lua:打印整数作为二进制

时间:2012-01-31 12:54:28

标签: binary lua

如何将整数表示为二进制?

所以我可以将7打印为111

8 个答案:

答案 0 :(得分:8)

你写一个函数来做到这一点。

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


这是最重要的第一个版本,可选的前导0填充到指定的位数:

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

答案 1 :(得分:2)

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 :(得分:2)

这是一个受所接受答案启发的函数,其语法正确,从右到左返回wriiten中的位表。

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

答案 3 :(得分:2)

有一种更快的方法可以利用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,结果将不会是'是对的。

答案 4 :(得分:1)

local function tobinary( number )
  local str = ""
  if number == 0 then
      return 0
  elseif number < 0 then
      number = - number
      str = "-"
  end
  local power = 0
  while true do
      if 2^power > number then break end
      power = power + 1
  end
  local dot = true
  while true do
      power = power - 1
      if dot and power < 0 then
          str = str .. "."
          dot = false
      end
      if 2^power <= number then
          number = number - 2^power
          str = str .. "1"
      else
          str = str .. "0"
      end
      if number == 0 and power < 1 then break end
  end
  return str
end

可能看起来更冗长,但它实际上比使用数学库函数的其他函数更快。适用于任何数字,无论是正数/负数/分数...

答案 5 :(得分:1)

local function tobits(num, str) -- tail call
    str = str or "B"
    if num == 0 then return str end 
    return tobits( 
          num >> 1 , -- right shift
          ((num & 1)==1 and "1" or "0") .. str   )
end          

答案 6 :(得分:0)

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

答案 7 :(得分:0)

这可能在没有bit32库的lua中不起作用

    function toBinary(number, bits)
        local bin = {}
        bits = bits - 1
        while bits >= 0 do --As bit32.extract(1, 0) will return number 1 and bit32.extract(1, 1) will return number 0
                       --I do this in reverse order because binary should like that
            table.insert(bin, bit32.extract(number, bits))
            bits = bits - 1
        end
        return bin
    end
    --Expected result 00000011
    print(table.concat(toBinary(3, 8)))

这至少需要lua 5.2(因为代码需要bit32库)