为什么这种按位操作在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中的int支持max 2 ^ 53值.我可能会失踪……

解决方法

正如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);
}
原文链接:https://www.f2er.com/js/157062.html

猜你在找的JavaScript相关文章