如何将整数表示为二进制?
所以我可以将7
打印为111
答案 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库)