Jak mogę reprezentować liczbę całkowitą jako Binary?Lua: drukowana liczba całkowita jako binarna
więc mogę wydrukować 7
jak 111
Jak mogę reprezentować liczbę całkowitą jako Binary?Lua: drukowana liczba całkowita jako binarna
więc mogę wydrukować 7
jak 111
napisać funkcję, aby to zrobić.
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))
w Lua 5.2 już mieć bitowe funkcje, które mogą pomóc (bit32)
Oto najbardziej znaczące, pierwsza wersja z opcjonalnym wiodących 0 wyściółką do określonej liczby bitów:
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
masz odwrócone bity w swojej funkcji, więc '20' zwróci' 00101', a nie '10100' – fl00r
nie określiłeś, czy chcesz mieć dużego czy małego endianina. Przykład też tego nie ujawnił, ponieważ 111 jest palindromem;). W każdym razie, adaptacja jest łatwa: wystarczy użyć 'nBits = sufitu (wybierz (2, matematyka.frexp (num))) i użyj pętli for zaczynając od nBits idąc na 1. – jpjacobs
moja wina, przepraszam, niemniej jednak odpowiedź jest dobrze i pożytecznie, dziękuję! – fl00r
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
Kolejny wa y to 'string.reverse (table.concat (t))' – user3125367
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
Ponieważ nikt nie chce używać table.insert, gdy jest to użyteczne, tutaj
W rzeczywistości użycie table.insert zwiększa złożoność algorytmu ** od O (n) ** do ** O (n^2) **. Robiąc to, co ** jpjacobs ** powiedział w swoim komentarzu, najpierw określ długość numeru, a następnie wypełnij tablicę do tyłu, jest znacznie wydajniejsze. Zwłaszcza dla dużych liczb. Jedyną zmianą byłoby zastąpienie 'while num> 0 do' przez' for i = math.ceil (select (2, math.frexp (num))), 1, -1 do' i 't [# t + 1 ] 'przez' t [i] '. – RPFeltz
Oto funkcja inspirowana przyjętą odpowiedzią z poprawną składnią, która zwraca tabelę bitów w wriiten od prawej do lewej.
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
Jest szybszy sposób, aby to zrobić, że korzysta z String.Format, który zamienia numery do podstawy 8. To trywialne następnie przekonwertować bazę 8 na binarny.
--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
Jeśli chcesz zachować je wszystkie tej samej wielkości, a następnie zrobić
s = string.format('%.22o', n)
Który dostaje 66 bitów. To dwa dodatkowe bity na końcu, ponieważ ósemkowe działa w grupach po 3 bity, a 64 nie jest podzielne przez 3. Jeśli chcesz 33 bity, zmień je na 11.
Jeśli masz bibliotekę BitOp, która jest domyślnie dostępny w LuaJIT, możesz to zrobić:
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
Ale pamiętaj, że tylko pierwsze 32 bity! Jeśli Twój numer jest większy niż 2^32, wynik nie będzie poprawny.
Spójrz [tutaj] (http://lua-users.org/lists/lua-l/2002-10/msg00245.html) (Chyba nie wbudowana funkcja?) –
jest trochę nieaktualna :) – fl00r