2012-01-31 16 views

Odpowiedz

5

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 
+1

masz odwrócone bity w swojej funkcji, więc '20' zwróci' 00101', a nie '10100' – fl00r

+1

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

+0

moja wina, przepraszam, niemniej jednak odpowiedź jest dobrze i pożytecznie, dziękuję! – fl00r

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 
+2

Kolejny wa y to 'string.reverse (table.concat (t))' – user3125367

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 

Ponieważ nikt nie chce używać table.insert, gdy jest to użyteczne, tutaj

+0

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

2

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 
2

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.

Powiązane problemy