2015-09-03 20 views
5

Sto provando a tradurre un codice da C a Lua e sto affrontando un problema. Come posso tradurre un AND bit a bit in Lua? Il codice sorgente C contiene:"Bitwise AND" in Lua

if ((comando & 0x80) == 0) ...

Come può essere fatto in Lua?

Sto usando Lua 5.1.4-8

+2

Hai provato a cercare su Internet per 'lua bitwise and' o' lua bitwise operations'? Perché dovrebbero trovarti la risposta di cui hai bisogno. –

+0

Sì, ho fatto una mezz'ora. Vedo che una libreria per bit per bit è stata aggiunta in 5.2, ma il mio router su cui ho intenzione di eseguire questo codice, continua a eseguire 5.1.4 e sais che è aggiornato. – Fusseldieb

+1

Il * primo link * sui miei risultati di ricerca di Google (e bing e yahoo) è su http://lua-users.org/wiki/BitwiseOperators che contiene le informazioni necessarie. –

risposta

3

Ecco una base, isolato bit a bit-e l'implementazione in puro Lua 5.1:

function bitand(a, b) 
    local result = 0 
    local bitval = 1 
    while a > 0 and b > 0 do 
     if a % 2 == 1 and b % 2 == 1 then -- test the rightmost bits 
      result = result + bitval  -- set the current bit 
     end 
     bitval = bitval * 2 -- shift left 
     a = math.floor(a/2) -- shift right 
     b = math.floor(b/2) 
    end 
    return result 
end 

utilizzo:

print(bitand(tonumber("1101", 2), tonumber("1001", 2))) -- prints 9 (1001) 
+0

Grazie per averlo postato di nuovo. – Fusseldieb

+0

Grazie mille. Ora sto lottando con un "Bitwise Left Shift" che sono ugualmente incapace. – Fusseldieb

+0

Questi due operandi sono necessari per controllare uno schermo LCD. Ora sono a metà strada grazie al tuo aiuto :) – Fusseldieb

3
OR, XOR, AND = 1, 3, 4 

function bitoper(a, b, oper) 
    local r, m, s = 0, 2^52 
    repeat 
     s,a,b = a+b+m, a%m, b%m 
     r,m = r + m*oper%(s-a-b), m/2 
    until m < 1 
    return r 
end 

print(bitoper(6,3,OR)) --> 7 
print(bitoper(6,3,XOR)) --> 5 
print(bitoper(6,3,AND)) --> 2