【问题标题】:bit32.band like operation in 64 bitsbit32.band 类似 64 位的操作
【发布时间】:2017-04-30 06:55:40
【问题描述】:

我想在 Lua 5.1 中应用 64 位的按位与运算。有算法吗? (我不知道该怎么做。)

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

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

【问题讨论】:

    标签: lua


    【解决方案1】:
    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】:

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

      【讨论】:

      • 非常感谢您的回答!在你回答之前我没有得到任何帮助,到目前为止也没有,但实际上我只需要使用数字中的 6 个八位字节。这基本上是因为我想创建一个字节数组系统,其中每个字节都可以更动态地修改,而无需使用 Lua 字符串。每个数字就像 6 个八位字节。所以是的,我注意到使用 64 位会有风险,但我没有看到仅使用 48 位(6 个八位字节)有任何风险,所以我只需要验证这 6 个字节。我主要是想这样做以避免浪费内存
      • 你也可以看看我的代码,但我停止写,直到我不知道如何做 AND 操作。算法。 pastebin.com/MFijjRCK
      • 你不能用除以 2 来移动尾数中的位。你只会减少指数字段。看看浮点数是如何工作的:en.wikipedia.org/wiki/IEEE_754-1985
      • 我不确定您是否理解只有前 48 位将用于执行这些操作和移位。我一直试图理解这些浮点/双精度编码,但我不理解 :///... 所以尾数是整数容器,对吧?那么这样 48 位将适合 52 位。
      • bit32 lib 会将这 52 位减少到 32 位。而且你不能在切割之前移动尾数中的位。当您将浮点数除以 2 时,您根本不会移动尾数,而是在递减指数字段。如果您感兴趣的位在那些切割的 32 位中无法访问,则您无法通过在 Lua 端除以或乘以浮点数来获得它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 2011-07-07
      • 1970-01-01
      • 2013-03-24
      相关资源
      最近更新 更多