既然你引用的地板功能的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
別擔心,你不需要改變任何東西。