2013-04-22 31 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