당신 (이하 2^31은 모든 31 개 루프를 필요로하지 않는 번호) 대부분의 작업에 대한 루프의 과도한 번호를 사용하여 바닥 기능 3 번을 참조하고 있기 때문에 ,^연산자를 사용하고 있고, 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
아무 것도 변경할 필요가 없습니다.