Поскольку вы ссылаетесь на функцию floor 3 раза, для большинства операций используете чрезмерное количество циклов (числа меньше 2 ^ 31 не требуют всех 31 циклов), вы используете оператор ^ и не используете заглавные буквы из-за того, что a и b могут быть совершенно разными числами с разными величинами, вы теряете большую эффективность. Функция также не локализована, и вы выполняете на две операции деления больше, чем нужно. Я написал это, чтобы быть достаточно быстрым.
В общем, вы увидите улучшения примерно в 3-20 раз.
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
Если вам нужно нечто большее, скажем, И, ИЛИ, и НЕ, тогда я вас тоже покрою.
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
Не волнуйтесь, вам не нужно ничего менять.