2013-04-22 135 views
0

我将一个Objective-C iOS应用程序移植到使用Lua的CoronaSDK中。我有一个签名 16位整数,我想隔离其中的高字节和低字节。在C中,您可以简单地执行:如何移位和屏蔽Lua中的整数位?

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

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

+0

除以256,并采取剩余? – 2013-04-22 23:41:46

+0

Lua 5.2有一个位操作库。 – lhf 2013-04-23 00:53:26

回答

4

我不知道Lua,但可以给你一个大概的想法。右移n等于除以2^n。你可以先除以2^8 = 256得到最高有效位,然后乘以2^8除以得到最低有效位。

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

这是考虑到所有这些都是无符号整数运算。

+0

啊,对!感谢你的回答。我有两个基于此功能的功能。作为单独的答案发帖,因为我无法在评论中获得正确的格式。 – 2013-04-23 00:12:14

1

基于@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 
+0

对于'value == -1',你会得到'high == -1','low == 255'。那是你需要的吗?在调用函数之前,您可能必须将'value'转换为无符号值'value = value%65536',以得到范围为'0..255'的两个结果。 – 2013-04-23 06:37:39

+0

忘记提及我在调用方法之前先照顾补充:如果value <0 then value = 0xffff + value end' – 2013-04-23 19:29:57

+0

为什么0xffff?它应该是0x10000 – 2013-04-23 20:30:38