Lua:检测位域中的上升/下降沿

我正在调用一个返回一个整数的函数,该整数表示16个二进制输入的位域,每个颜色都可以打开或关闭。

我正在尝试创建一个函数来获取旧状态和新状态之间的差异,

例如

function getChanges(oldColors,newColors)

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

我已经尝试将旧颜色从新颜色中减去以及将新颜色从旧颜色中减去,但是这似乎会导致混乱,如果超过1个值发生变化。

这是为了检测多个输入的上升/下降沿。

\ **\ *编辑:似乎有[lua位API的子集]可用(http://computercraft.info/wiki/Bit_(API))

来自: [ComputerCraft wiki](http://computercraft.info/wiki/Colors_(API))

颜色.白色     1       0x1     0000000000000001
colors.orange    2       0x2     0000000000000010
颜色.洋红    4       0x4     0000000000000100
colors.lightBlue 8       0x8     0000000000001000
颜色。黄色    16      0x10    0000000000010000
颜色。青柠檬      32      0x20    0000000000100000
颜色。粉红色      64      0x40    0000000001000000
颜色。灰色      128     0x80    0000000010000000
颜色。浅灰色 256     0x100   0000000100000000
颜色。青色      512     0x200   0000001000000000
颜色。紫色    1024    0x400   0000010000000000
颜色。蓝色      2048    0x800   0000100000000000
颜色。棕色    4096    0x1000  0001000000000000
颜色。绿色    8192    0x2000  0010000000000000
colors.red       16384   0x4000  0100000000000000
颜色。黑色     32768   0x8000  1000000000000000

(这里原来应该有一个值表,但我无法弄清楚markdown的语法,这似乎忽略了标准的HTML部分。)

点赞
用户1847592
用户1847592
```lua
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

将旧颜色和新颜色作为参数传递给 "getChanges" 函数。函数使用 Lua 中的位操作 "bit.band" 和 "bit.bnot" 执行按位与和取反操作,以获取添加和删除的颜色。颜色名称和它们的二进制掩码存储在一个表中。函数生成一个名为 "diff" 的新表,其中包含颜色名称和对应的 "added"、"removed" 或空字符串值。最后,函数返回 "diff" 表。

2013-04-20 20:01:39