Javascript中的48位按位运算?

时间:2010-04-04 18:56:31

标签: javascript random bitwise-operators

我已经完成了将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()相同的值。我该怎么做才能建立一个更快速,更实用的端口?

4 个答案:

答案 0 :(得分:4)

您可以使用foo & ((1 << 48) - 1)而不是foo % Math.pow(2,48)

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

答案 1 :(得分:0)

JavaScript中无法进行48位按位操作。你可以使用两个数字来模拟它。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

它比位移慢,但允许您扩展到32位以上。一旦您考虑了支持更高位数所需的其他代码,可能成为bits > 32的更快解决方案,但您必须进行一些分析才能找到答案。