Lua中的“按位与”

时间:2015-09-03 23:45:22

标签: lua bit-manipulation operators

我正在尝试将代码从C转换为Lua,我遇到了问题。 如何在Lua中翻译按位AND? 源代码C代码包含:

if((command& 0x80)== 0)    ...

如何在Lua中完成?

我正在使用Lua 5.1.4-8

5 个答案:

答案 0 :(得分:4)

OR, XOR, AND = 1, 3, 4

function bitoper(a, b, oper)
   local r, m, s = 0, 2^52
   repeat
      s,a,b = a+b+m, a%m, b%m
      r,m = r + m*oper%(s-a-b), m/2
   until m < 1
   return r
end

print(bitoper(6,3,OR))   --> 7
print(bitoper(6,3,XOR))  --> 5
print(bitoper(6,3,AND))  --> 2

答案 1 :(得分:2)

这是纯Lua 5.1中基本的,孤立的按位和实现:

function bitand(a, b)
    local result = 0
    local bitval = 1
    while a > 0 and b > 0 do
      if a % 2 == 1 and b % 2 == 1 then -- test the rightmost bits
          result = result + bitval      -- set the current bit
      end
      bitval = bitval * 2 -- shift left
      a = math.floor(a/2) -- shift right
      b = math.floor(b/2)
    end
    return result
end

用法:

print(bitand(tonumber("1101", 2), tonumber("1001", 2))) -- prints 9 (1001)

答案 2 :(得分:0)

如果使用 Adob​​e Lightroom Lua ,则Lightroom SDK包含LrMath.bitAnd()方法用于“按位与”操作:

-- x = a AND b

local a = 11
local b = 6
local x  = import 'LrMath'.bitAnd(a, b)

-- x is 2

还有LrMath.bitOr(a, b)LrMath.bitXor(a, b)方法用于“按位OR”和“双向XOR”操作。

答案 3 :(得分:0)

这是我按位方式的示例-以及一个常数为0x8000的值: result = (value % 65536) - (value % 32768) -- bitwise and 0x8000

答案 4 :(得分:-1)

这个答案专门针对 Lua 5.1.X

你可以使用

if( (bit.band(command,0x80)) == 0) then
...

在 Lua 5.3.X 及以后,它非常简单......

print(5 & 6)

希望有帮助?