有些人请在
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 | +--------------------------------+
解决方法
正如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); }