2012-04-26 55 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程序,以便它可以使用它们。