【问题标题】:48-bit bitwise operations in Javascript?Javascript中的48位按位运算?
【发布时间】:2011-02-04 06:06:15
【问题描述】:

我被赋予了将 Java 的 Java.util.Random() 移植到 JavaScript 的任务,并且在足够大的数字上使用 Javascript 中的位运算符时,我遇到了巨大的性能损失/不准确。一些粗略的研究表明“JavaScript 中的按位运算符天生就很慢”,因为在内部看来,JavaScript 会将其所有双精度值转换为有符号的 32 位整数来执行按位运算(see here 了解更多信息。)因为其中,我无法直接移植 Java 随机数生成器,我需要得到与Java.util.Random() 相同的数值结果。写类似

  this.next = function(bits) {
    if (!bits) {
       bits = 48;
    }
    this.seed = (this.seed * 25214903917 + 11) & ((1 << 48) - 1);
    return this.seed >>> (48 - bits);
  };

(这是Java.util.Random() 的几乎直接端口)代码将无法正常工作,因为 Javascript 无法对这样大小的整数进行按位运算。)

我发现我可以使用 Lehmer 算法在 32 位空间中创建一个可种子随机数生成器,但诀窍是我需要获得与 Java.util.Random() 相同的值。我应该怎么做才能制作一个更快、功能更强大的端口?

【问题讨论】:

    标签: javascript random bitwise-operators


    【解决方案1】:

    您应该可以使用foo % Math.pow(2,48),而不是foo &amp; ((1 &lt;&lt; 48) - 1)

    Javascript 中的所有数字都是 64 位浮点数,足以表示任何 48 位整数。

    【讨论】:

      【解决方案2】:

      另一种方法是使用由 48 个布尔值组成的布尔数组,并自己实现移位。不过,我不知道这是否更快;但我对此表示怀疑,因为所有布尔值都存储为双精度值。

      【讨论】:

        【解决方案3】:

        请记住,位移直接相当于乘以或除以 2 的幂。

        1 << x == 1 * Math.pow(2,x)
        

        它比位移慢,但允许您扩展超过 32 位。对于bits &gt; 32,它可能是一个更快的解决方案,一旦您考虑到支持更高位数所需的额外代码,但您必须进行一些分析才能找到答案。

        【讨论】:

          【解决方案4】:

          在 JavaScript 中不能进行 48 位按位运算。不过,您可以使用两个数字来模拟它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-11-03
            • 1970-01-01
            • 1970-01-01
            • 2014-04-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多