Lua bit32.64位中的带式操作

Lua bit32.64位中的带式操作,lua,Lua,我想在Lua5.1中应用64位的按位AND运算。有算法吗?(我不知道怎么做。) 注意:我总共只需要操作48位,而且我对它们没有任何问题 在游戏的Lua脚本中,只有bit32库。Lua默认内部使用双浮点数。它的尾数只有52位,因此您无法安全地存储64位整数而不冒获取无效浮点值的风险

我想在Lua5.1中应用64位的按位AND运算。有算法吗?(我不知道怎么做。)

注意:我总共只需要操作48位,而且我对它们没有任何问题


在游戏的Lua脚本中,只有
bit32
库。

Lua默认内部使用双浮点数。它的尾数只有52位,因此您无法安全地存储64位整数而不冒获取无效浮点值的风险<使用32位,它相当安全。Lua 5.2手册用以下数字描述了bit32库中发生的情况:

除非另有说明,否则所有函数都接受 范围(-2^51,+2^51);每个参数都被规范化为其参数的剩余部分 除以2^32并截断为整数(以某种未指定的方式), 使其最终值在[0,2^32-1]范围内。同样,所有 结果在[0,2^32-1]范围内


您必须在32位块中工作。
或者引入您自己的64位类型(可能由userdata托管),并为该类型定义64位操作。

默认情况下,Lua在内部使用双浮点数。它的尾数只有52位,因此您无法安全地存储64位整数而不冒获取无效浮点值的风险<使用32位,它相当安全。Lua 5.2手册用以下数字描述了bit32库中发生的情况:

local function band48 (x, y)
   local xl = x % 4294967296
   local yl = y % 4294967296
   local xh = (x - xl) / 4294967296
   local yh = (y - yl) / 4294967296
   return bit32.band(xh, yh) * 4294967296 + bit32.band(xl, yl)
end

print(band48(7 * 2^33 + 3, 5*2^33 + 5)) --> 5*2^33+1 = 42949672961
除非另有说明,否则所有函数都接受 范围(-2^51,+2^51);每个参数都被规范化为其参数的剩余部分 除以2^32并截断为整数(以某种未指定的方式), 使其最终值在[0,2^32-1]范围内。同样,所有 结果在[0,2^32-1]范围内


您必须在32位块中工作。
或者介绍您自己的64位类型(可能由userdata托管),并为该类型定义64位操作。

非常感谢您的回答!在你回答之前我没有得到任何帮助,到目前为止也没有,但实际上我只需要使用数字中的6个八位字节。这基本上是因为我想创建一个字节数组系统,在这个系统中,每个字节都可以进行更友好的修改,而不需要使用Lua字符串。每个数字将类似于6个八位字节。是的,我注意到64位会有风险,但我没有看到使用48位(6个八位字节)会有任何风险,所以我只需要验证这6个字节。我主要是想这样做,以避免浪费内存。你也可以看看我的代码,但我停止了写,直到我不知道如何做和运算算法。不能用数字除以2来移动尾数中的位。您将只得到递减的指数字段。看看浮点数是如何工作的:我不确定您是否理解只有前48位将用于执行这些操作和移位。我一直试图理解这些浮点/双精度编码,但我没有://。。。尾数是整数容器,对吗?这样,48位将适合52位。bit32lib将52位缩减为32位。在切割之前你不能移动尾数。当你们们将浮点除以2,你们们根本并没有移动尾数,你们们是在递减指数域。如果您感兴趣的位在那些剪切的32位中不可访问,您无法通过在Lua端除以或乘以浮点数来获得这些位。非常感谢您的回答!在你回答之前我没有得到任何帮助,到目前为止也没有,但实际上我只需要使用数字中的6个八位字节。这基本上是因为我想创建一个字节数组系统,在这个系统中,每个字节都可以进行更友好的修改,而不需要使用Lua字符串。每个数字将类似于6个八位字节。是的,我注意到64位会有风险,但我没有看到使用48位(6个八位字节)会有任何风险,所以我只需要验证这6个字节。我主要是想这样做,以避免浪费内存。你也可以看看我的代码,但我停止了写,直到我不知道如何做和运算算法。不能用数字除以2来移动尾数中的位。您将只得到递减的指数字段。看看浮点数是如何工作的:我不确定您是否理解只有前48位将用于执行这些操作和移位。我一直试图理解这些浮点/双精度编码,但我没有://。。。尾数是整数容器,对吗?这样,48位将适合52位。bit32lib将52位缩减为32位。在切割之前你不能移动尾数。当你们们将浮点除以2,你们们根本并没有移动尾数,你们们是在递减指数域。如果您感兴趣的位在这些32位中不可访问,则无法通过在Lua端除以或乘以浮点数来获取该区域中的位。
local function band48 (x, y)
   local xl = x % 4294967296
   local yl = y % 4294967296
   local xh = (x - xl) / 4294967296
   local yh = (y - yl) / 4294967296
   return bit32.band(xh, yh) * 4294967296 + bit32.band(xl, yl)
end

print(band48(7 * 2^33 + 3, 5*2^33 + 5)) --> 5*2^33+1 = 42949672961