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.