2012-04-26 57 views
0

簽署32位整數在Java中,當我下面的左移位操作,我得到了否定的結果,由於整數/長溢出: 0xAAAAAAAA < < 7給了我-183251938048如何模擬在Lua

但是,在Lua中,因爲一切都是一個52位浮點的Lua數;我不能在左移時觸發溢出: bit_lshift(0xAAAAAAAA,7)給我1431655680

如何在Lua中模擬32位有符號整數?

回答

1

你寫了一些C函數來處理這個,然後將它們導出到Lua。

雖然一般來說,Lua代碼不應該觸及這個低級別的東西。

+0

我正在Lua env工作。由於我無法使用外部C庫,所以控制有限。我正在尋找一個純粹的Lua實現。 – rohit 2012-04-26 18:31:35

+0

@rohit:那麼你必須自己寫。一般來說,像這樣的低級概念的純Lua實現不存在。 – 2012-04-26 18:46:54

+0

雖然當然,如果你寫了它,分享它;那麼將會有一個純粹的Lua實現...:](純Lua workalike bit32庫在這種情況下會很有用) – snogglethorpe 2012-04-26 21:48:29

1

您正在尋找位於Lua的位操作庫。一個這樣的庫是來自LuaJIT的作者bitop,它直接包含它而不需要安裝。你也可以將它安裝在標準的Lua中。

另一個庫是包含在Lua 5.2中的bit32庫。

這兩個庫讓你操縱32位數字。例如與bitop

local bit = require 'bit 
print(bit.lshift(0xAAAAAAAA, 7)) --> 1431655680 

我不知道你是怎麼得到負數,因爲1431655680是什麼,我得到這樣做(0xAAAAAAAA < < 7)& 0xFFFFFFFF的在C(也做,在一個「編程計算器「)。

+0

由於您處理的是無符號整數,所以您的移位操作爲您提供了一個正數。他特別需要* signed *整數的某些行爲。爲什麼,我不知道;通常,人們試圖避免在有符號整數上發生移位。 – 2012-04-26 18:43:56

+0

這很奇怪,因爲[bitop語義頁面](http://bitop.luajit.org/semantics.html)明確指出**「所有操作都基於32位整數」**和**「所有位操作定義爲返回帶符號32位數範圍內的結果「** – 2012-04-26 19:16:14

+0

也可能是因爲他將其與Java進行比較,Java可能具有時髦的非C規則,這些規則是關於如何移位帶符號整數的工作原理。 – 2012-04-26 19:21:42

1

我希望我不會被這麼說,但從Lua模擬Java的最好方法是從Lua使用Java。

如果您需要模擬Java,很可能您的Lua已經嵌入了它。只需將Java的二進制操作暴露給Lua程序,以便它可以使用它們。