【问题标题】:How to shift and mask bits from integer in Lua?如何在Lua中从整数中移位和屏蔽位?
【发布时间】:2013-06-07 04:05:13
【问题描述】:

我正在将一个 Objective-C iOS 应用程序移植到使用 Lua 的 CoronaSDK。我有一个 signed 16 位整数,我想隔离其中的高字节和低字节。在 C 中,您可以简单地执行以下操作:

uint8_t a = (dx >> 8) & 0xff;
uint8_t b = dx & 0xff;

Lua 没有位运算符。我怎样才能在 Lua 中做到这一点?这是用于移动应用程序和扩展 Lua 的外部二进制库,如果有的话,很可能不适用于所有设备。您可以建议任何纯 Lua 解决方案来解决这个问题吗?

【问题讨论】:

  • 除以256取余数?
  • Lua 5.2 有一个位操作库。

标签: lua coronasdk


【解决方案1】:

我不了解 Lua,但可以给你一个大致的想法。右移 n 相当于除以 2^n。您可以先除以 2^8 = 256 得到 MSB,然后乘除以 2^8 得到 LSB。

MSBs = dx / 256
LSBleftsifted = (ds * 256)
LSBs = LSBleftsifted / 256

这是考虑到这一切都是一个无符号整数运算。

【讨论】:

  • 啊,对了!感谢你的回答。我有两个基于此工作的功能。发布为单独的答案,因为我无法在评论中获得正确的格式。
【解决方案2】:

根据@ash 的回答,这里有几个 Lua 函数。我确信它们可以被概括,但这正是我所需要的:

local function getLowByte16( value )
    local high_value = math.floor(value/256)
    high_value = high_value*256
    local low_value = value - high_value
    return low_value
end

local function getHighByte16( value )
    local high_value = math.floor(value/256)
    return high_value
end

【讨论】:

  • 对于value == -1,您将获得high == -1low == 255。那是你需要的吗?在调用您的函数之前,您可能必须将 value 转换为 value = value % 65536 的 unsigned 才能在 0..255 范围内获得两个结果。
  • 忘了提到在调用方法之前我会处理这个问题:if value < 0 then value = 0xffff + value end
  • 为什么是 0xffff?它应该是 0x10000
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
相关资源
最近更新 更多