2014-02-13 50 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

相關問題