2011-05-12 22 views
5

¿Cómo puedo implementar operadores bit a bit en el lenguaje Lua?
Específicamente, necesito un operador/método XOR.Lua - Operaciones lógicas de bit a bit

Me encantaría saber si alguna vez se ha ocupado de la operación lógica en Lua.

[Solucionado] - Esto es lo que solía:

local floor = math.floor 
function bxor (a,b) 
    local r = 0 
    for i = 0, 31 do 
    local x = a/2 + b/2 
    if x ~= floor (x) then 
     r = r + 2^i 
    end 
    a = floor (a/2) 
    b = floor (b/2) 
    end 
    return r 
end 

Respuesta

9

En Lua 5.2, puede utilizar la función de bit32.bxor.

3

Si necesita una forma eficiente de hacer cambios a nivel de bit, escribí an article about that hace un tiempo. Aquí hay algunas funciones que envuelven la técnica:

function lshift(x, by) 
    return x * 2^by 
end 

function rshift(x, by) 
    return math.floor(x/2^by) 
end 
5

Puesto que usted está haciendo referencia a la función del piso 3 veces, usando un número excesivo de bucles para la mayoría de las operaciones (números de menos de 2^31 no necesita los 31 bucles) , están usando el operador^y no aprovechan el hecho de que a y b pueden ser números muy diferentes con diferentes magnitudes, están perdiendo mucha eficiencia. La función tampoco está localizada, y está haciendo dos operaciones de división más de las que necesita. Escribí esto para ser razonablemente rápido.

En general, verá mejoras de aproximadamente 3 a 20 veces.

local function BitXOR(a,b)--Bitwise xor 
    local p,c=1,0 
    while a>0 and b>0 do 
     local ra,rb=a%2,b%2 
     if ra~=rb then c=c+p end 
     a,b,p=(a-ra)/2,(b-rb)/2,p*2 
    end 
    if a<b then a=b end 
    while a>0 do 
     local ra=a%2 
     if ra>0 then c=c+p end 
     a,p=(a-ra)/2,p*2 
    end 
    return c 
end 

Si necesita más que esto, dicen Y, O y NO, entonces yo lo cubrimos allí, también.

local function BitOR(a,b)--Bitwise or 
    local p,c=1,0 
    while a+b>0 do 
     local ra,rb=a%2,b%2 
     if ra+rb>0 then c=c+p end 
     a,b,p=(a-ra)/2,(b-rb)/2,p*2 
    end 
    return c 
end 

local function BitNOT(n) 
    local p,c=1,0 
    while n>0 do 
     local r=n%2 
     if r<1 then c=c+p end 
     n,p=(n-r)/2,p*2 
    end 
    return c 
end 

local function BitAND(a,b)--Bitwise and 
    local p,c=1,0 
    while a>0 and b>0 do 
     local ra,rb=a%2,b%2 
     if ra+rb>1 then c=c+p end 
     a,b,p=(a-ra)/2,(b-rb)/2,p*2 
    end 
    return c 
end 

No te preocupes, no necesitarás cambiar nada.

7

En Lua 5.2, puede usar funciones en la biblioteca bit32.

En Lua 5.3, bit32 biblioteca es obsoleto porque ahora son nativos bitwise operators.

print(3 & 5) -- bitwise and 
print(3 | 5) -- bitwise or 
print(3 ~ 5) -- bitwise xor 
print(7 >> 1) -- bitwise left shift 
print(7 << 1) -- bitwise left shift 
print(~7)  -- bitwise not 

Salida:

1 
7 
6 
3 
14 
-8 
0



Esto es muy simple. usa la lógica NAND. https://en.wikipedia.org/wiki/NAND_logic

function xor(a,b) 
    return not(not(a and not(a and b)) and not(b and not(a and b))) 
end 

si también necesita 1,0 entradas insertar el siguiente a la función

a = a==1 or a == true -- to accept nil, 1, 0, true or false 
    b = b==1 or b == true -- to accept nil, 1, 0, true or false 

Espero que esto ayude a alguien.

Cuestiones relacionadas