2013-04-20 31 views
0

我在調用一個返回整數的函數,該整數代表16個二進制輸入的位域,每個顏色可以打開或關閉。Lua:檢測位域中的上升沿/下降沿

我試圖創建一個函數來獲取原狀態數和新狀態之間的變化,

例如

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 

(也被認爲是此值的表,但我不能工作了語法爲markdown,它會出現stackoverflow忽略標準的html部分。)

+0

Lua不帶有位運算符。如果使用第三方庫是一個選項,這裏是一個概述:http://lua-users.org/wiki/BitwiseOperators ...實際上,如果您使用的是Lua 5.2,那麼應該包含它們之一 – 2013-04-20 19:49:54

+0

那裏似乎是一個子集,如果它不是5.2,我將它添加到問題中,但我仍然迷失。 http://computercraft.info/wiki/Bit_%28API%29 – 2013-04-20 19:53:34

回答

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!所以訣竅是和(新,舊!)和(!新,舊)謝謝! – 2013-04-20 20:05:09