2011-05-12 8 views
5

어떻게 루아 어 언어로 비트 연산자를 구현할 수 있습니까?
특히 XOR 연산자/메소드가 필요합니다.루아 - 비트 논리 연산

루아에서 논리적 조작을 다룬 적이 있다면 듣고 싶습니다.

는 [SOLVED] - 여기 내가 사용하는 작업은 다음과 같습니다

local floor = math.floor 
function bxor (a,b) 
    local r = 0 
    for i = 0, 31 do 
    local x = a/2 + b/2 
    if x ~= floor (x) then 
     r = r + 2^i 
    end 
    a = floor (a/2) 
    b = floor (b/2) 
    end 
    return r 
end 

답변

9

루아 5.2에서, 당신은 bit32.bxor 기능을 사용할 수 있습니다.

3

비트 시프트를 수행하는 효율적인 방법이 필요한 경우 조금 전에 an article about that이라고 적었습니다. 여기에 몇 가지 기능입니다있는 포장 기술 :

function lshift(x, by) 
    return x * 2^by 
end 

function rshift(x, by) 
    return math.floor(x/2^by) 
end 
5

당신 (이하 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 

아무 것도 변경할 필요가 없습니다.

7

루아 5.2에서는 라이브러리 bit32의 함수를 사용할 수 있습니다.

네이티브 bitwise operators이 있으므로 Lua 5.3에서 bit32 라이브러리는 폐기되었습니다.

print(3 & 5) -- bitwise and 
print(3 | 5) -- bitwise or 
print(3 ~ 5) -- bitwise xor 
print(7 >> 1) -- bitwise left shift 
print(7 << 1) -- bitwise left shift 
print(~7)  -- bitwise not 

출력 :

1 
7 
6 
3 
14 
-8 
0



이 매우 간단합니다. NAND 로직을 사용한다. 당신은 또한 1,0 입력이이 사람을 도움이

a = a==1 or a == true -- to accept nil, 1, 0, true or false 
    b = b==1 or b == true -- to accept nil, 1, 0, true or false 

희망 함수에 다음과 같은 삽입하기 경우 https://en.wikipedia.org/wiki/NAND_logic

function xor(a,b) 
    return not(not(a and not(a and b)) and not(b and not(a and b))) 
end 

.