2013-04-20 3 views
0

16 비트 입력의 비트 필드를 나타내는 정수를 반환하는 함수를 호출합니다. 각각의 색상은 켜기 또는 끌 수 있습니다.루아 : 비트 필드의 상승/하강 에지를 감지합니다.

나는 oldstate가 새로운 상태의 변화를 얻을 수있는 기능을 만들려고 해요,

예를 들어,

function getChanges(oldColors,newColors) 

    sampleOutput = {white = "",orange="added",magenta="removed" .....} 
    return sampleOutput 
end 

나는 newColors과 oldColors에서 새 색상에서 oldColors을 뺀 시도했지만이 혼돈해야 더 후 1 개 값 변경을 초래할 것으로 보인다.

여러 입력에서 상승/하강 에지를 감지하는 것입니다.

* *이 편집는 :있을 나타나는 subset of the lua bit api available

에서 : ComputerCraft wiki

colors.white  1  0x1  0000000000000001 
colors.orange 2  0x2  0000000000000010 
colors.magenta 4  0x4  0000000000000100 
colors.lightBlue 8  0x8  0000000000001000 
colors.yellow 16  0x10 0000000000010000 
colors.lime  32  0x20 0000000000100000 
colors.pink  64  0x40 0000000001000000 
colors.gray  128  0x80 0000000010000000 
colors.lightGray 256  0x100 0000000100000000 
colors.cyan  512  0x200 0000001000000000 
colors.purple 1024 0x400 0000010000000000 
colors.blue  2048 0x800 0000100000000000 
colors.brown  4096 0x1000 0001000000000000 
colors.green  8192 0x2000 0010000000000000 
colors.red  16384 0x4000 0100000000000000 
colors.black  32768 0x8000 1000000000000000 

(여기 저기 값의 테이블로했는데,하지만 난 운동 할 수 없습니다 stackdownflow가 표준의 HTML 부분을 무시하는 것처럼 보일 것입니다.)

+0

루아는 비트 연산자와 함께 제공되지 않습니다 . 타사 라이브러리를 사용할 수있는 경우, 개요는 다음과 같습니다 : http://lua-users.org/wiki/BitwiseOperators ... 사실 Lua 5.2를 사용하는 경우 하나를 포함해야합니다 ( –

+0

). 5.2가 아닌 경우 하위 집합으로 보입니다. 질문에 추가했지만 여전히 잃어 버렸습니다. http://computercraft.info/wiki/Bit_%28API%29 –

답변

3
function getChanges(oldColors,newColors) 
    local added = bit.band(newColors, bit.bnot(oldColors)) 
    local removed = bit.band(oldColors, bit.bnot(newColors)) 
    local color_names = { 
     white = 1, 
     orange = 2, 
     magenta = 4, 
     lightBlue = 8, 
     yellow = 16, 
     lime = 32, 
     pink = 64, 
     gray = 128, 
     lightGray = 256, 
     cyan = 512, 
     purple = 1024, 
     blue = 2048, 
     brown = 4096, 
     green = 8192, 
     red = 16384, 
     black = 32768 
    } 
    local diff = {} 
    for cn, mask in pairs(color_names) do 
     diff[cn] = bit.band(added, mask) ~= 0 and 'added' 
     or bit.band(removed, mask) ~= 0 and 'removed' or '' 
    end 
    return diff 
end 
+0

AH! 그래서 트릭은 ~과 (new,! old) 그리고 (! new, old) 감사합니다! –