既然你引用的地板功能的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
如果你需要比这更多,说的AND,OR,和NOT,然后我有你覆盖那里。
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
别担心,你不需要改变任何东西。