【发布时间】:2017-04-30 06:55:40
【问题描述】:
我想在 Lua 5.1 中应用 64 位的按位与运算。有算法吗? (我不知道该怎么做。)
注意:我总共只需要对 48 位进行操作,我对它们没有任何问题。
在我正在编写脚本的游戏 Lua 中,只有 bit32 库。
【问题讨论】:
标签: lua
我想在 Lua 5.1 中应用 64 位的按位与运算。有算法吗? (我不知道该怎么做。)
注意:我总共只需要对 48 位进行操作,我对它们没有任何问题。
在我正在编写脚本的游戏 Lua 中,只有 bit32 库。
【问题讨论】:
标签: 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
【讨论】:
Lua 默认在内部使用双浮点数。它只有 52 位用于尾数,因此您不能安全地存储 64 位整数而不冒获得无效浮点值的风险。
32 位是相当安全的。 Lua 5.2 手册用数字描述了 bit32 lib 中发生的事情:
除非另有说明,否则所有函数都接受数字参数 范围(-2^51,+2^51);每个参数都归一化为其其余部分 除以 2^32 并截断为整数(以某种未指定的方式), 使其最终值落在 [0,2^32 - 1] 范围内。同样,所有 结果在 [0,2^32 - 1] 范围内。
您必须在 32 位块中工作。
或者可能引入您自己的 64 位类型,可能与用户数据一起托管,并为该类型定义 64 位操作。
【讨论】: