2014-02-13 48 views
7

做位运算在JavaScript中,我得到的时候在此方面的一个请阐明:为什么按位操作是失败的Javascript

65527|34359738368 =>65527

是否有可能在JavaScript来处理呢?

从MySQL命令行:

select 65527|34359738368 ; 
+-------------------+ 
| 65527|34359738368 | 
+-------------------+ 
|  34359803895 | 
+-------------------+ 

而且更重要的是其不到2^36

select (65527|34359738368)< pow(2,36); 
+--------------------------------+ 
| (65527|34359738368)< pow(2,36) | 
+--------------------------------+ 
|        1 | 
+--------------------------------+ 

我从这个SO Q读什么是在JavaScript支持最大2^53值INT。我可能会丢失某事

回答

2

正如Tim已经指出的那样,JavaScript中的按位操作使用32位数字。一种解决方案(也许最简单)是使用支持按位运算的bignum库,例如:https://www.npmjs.org/package/bignum

另一种方式来做到这将是打破分开成数的话,做的话的操作,老派风格:

var a = 65527; 
var b = 34359738368; 
var wordSize = 4294967296; // 2^32 
var ah = Math.floor(a/wordSize); 
var al = a - ah*wordSize; 
var bh = Math.floor(b/wordSize); 
var bl = b - bh*wordSize; 

var xh = ah | bh; 
var xl = al | bl; 
var x = xh*wordSize + xl; 

我们所要做的是两个操作数闯入两个单词(高和低),对单词进行操作,使我们的结果(x)成为一个高低的单词,然后重新组合它们来创造一个单词。

你可以,当然,这种捆绑成一个整齐的功能:

function or64(a,b){ 
    var w64 = 18446744073709552000; // 2^64 
    var w32 = 4294967296;   // 2^32 
    if(a>w64 || b>w64) 
     throw new Error('operands cannot exceed 64 bits'); 
    var ah = Math.floor(a/w32); 
    var al = a - ah*w32; 
    var bh = Math.floor(b/w32); 
    var bl = b - bh*w32; 
    return (ah|bh)*w32 + (al|bl); 
} 
+0

这似乎是nodejs包,我们如何在web客户端使用它? – sakhunzai

+0

你可以从项目中提取'BigNum'类。它在'index.js'中。 –

+0

完美,谢谢 – sakhunzai

3

您链接到自己回答:

注意,位运算符和移位运算32位整数操作。

+0

该死。你击败了我。 –

+0

谢谢,但是周围怎么样? – sakhunzai

相关问题