Lua中的"位与"

我正在尝试将C代码翻译成Lua,但遇到了问题。 在Lua中如何翻译位与运算符? 源C代码包含:

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

在Lua中该如何实现?

我使用的是Lua 5.1.4-8版本。

点赞
用户2726734
用户2726734

这是一个基本的、独立的位与实现,使用纯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 -- 测试最右边的位
          result = result + bitval      -- 设置当前位
      end
      bitval = bitval * 2 -- 左移
      a = math.floor(a/2) -- 右移
      b = math.floor(b/2)
    end
    return result
end

用法:

print(bitand(tonumber("1101", 2), tonumber("1001", 2))) -- 打印 9 (1001)
2015-09-04 00:31:33
用户1847592
用户1847592

Lua 5.1 中用于非负 32 位整数的位运算实现

OR, XOR, AND = 1, 3, 4

function bitoper(a, b, oper)
   local r, m, s = 0, 2^31
   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
2015-09-04 02:06:27
用户11196063
用户11196063

如果您使用 Adobe 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) 方法用于执行 "按位或" 和 "按位异或" 操作。

2019-04-01 09:07:23
用户12227387
用户12227387

以下是一个示例,说明我如何对一个常量 0x8000 进行按位与操作:

result = (value % 65536) - (value % 32768)  -- 按位与 0x8000
2019-10-16 14:52:25
用户14926389
用户14926389

这个答案特别适用于 Lua 5.1.X

你可以使用

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

在 Lua 5.3.X 及之后的版本中,非常简单...

print(5 & 6)

希望有所帮助。

2021-01-02 10:02:36