64位中的bit32.band操作

我想在Lua 5.1中应用64位的位与操作。有没有算法可以做到这一点?(我不知道怎么做。)

注意:我只需要对48位进行操作,它们都没有问题。

在我编写的游戏Lua中,只有 bit32 库。

点赞
用户5675002
用户5675002

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位操作。

2017-04-29 21:23:16
用户1847592
用户1847592
本地函数 `band48(x, y)` 的作用是对 `x` 和 `y` 进行位运算。函数内部首先将 `x` 和 `y` 分别除以 `4294967296`,得到余数 `xl` 和 `yl`,商 `xh` 和 `yh`,然后使用 `bit32.band()` 函数对 `xh` 和 `yh` 进行按位与运算,最后将运算结果乘以 `4294967296`,并再次使用 `bit32.band()` 函数对 `xl` 和 `yl` 进行按位与运算,最终得到 `x` 和 `y` 的按位与结果。

下面是一个测试样例,`band48(7 * 2^33 + 3, 5*2^33 + 5)` 的结果是 `5*2^33+1 = 42949672961`。

```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
2017-04-29 22:55:40