有些人请在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中的int支持max 2^53
值。我可能会失踪......
答案 0 :(得分:3)
你自己联系了答案:
请注意,按位运算符和移位运算符以32位整数运行。
答案 1 :(得分: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);
}
答案 2 :(得分:0)
现在(2020年),您还可以使用 BigInt ,因为ES2020是标准的内置对象。 BigInt可用于任意大的整数。
在JavaScript中将标准数字转换为BigInt的最简单方法是在其后附加“ n”。像这样:
65527n|34359738368n => 34359803895n
有关更多信息,请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt