为什么按位操作是失败的Javascript
问题描述:
做位运算在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。我可能会丢失某事
答
正如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);
}
这似乎是nodejs包,我们如何在web客户端使用它? – sakhunzai
你可以从项目中提取'BigNum'类。它在'index.js'中。 –
完美,谢谢 – sakhunzai