Javascript中此按位操作失败的原因

Javascript中此按位操作失败的原因,javascript,Javascript,请有人在javascript中执行逐位操作时阐明这一点: 65527 | 34359738368=>65527 可以用javascript处理这个问题吗 从mysql命令行: select 65527|34359738368 ; +-------------------+ | 65527|34359738368 | +-------------------+ | 34359803895 | +-------------------+ 更重要的是,它小于2^36 select (65

请有人在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 |
+--------------------------------+
select(65527 | 34359738368)

我从中了解到javascript中的int支持max
2^53
value。我可能错过了某件事

你自己链接到了答案:

请注意,按位运算符和移位运算符对32位整数进行操作


正如Tim已经指出的,JavaScript中的按位操作使用32位数字。一种解决方案(可能是最简单的)是使用支持按位操作的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);
}
现在(2020年),您还可以使用BigInt,因为ES2020是一个标准的内置对象。BigInt可用于任意大的整数

在JavaScript中,将标准数字转换为BigInt的最简单方法是在其上附加“n”。像这样:

65527n|34359738368n => 34359803895n

有关更多信息,请参见。你比我快。谢谢。但是怎么办呢?这似乎是nodejs包,我们如何在web客户端中使用它?你可以从项目中提取
BigNum
类。它在
index.js
中。欢迎您:请注意,我更正了代码:它应该使用
Math.floor
,而不是
Math.round
,否则您有时会得到一个差的结果。所以在按位
执行操作时,我们只需要更改最后一个语句:
return(ah&bh)*w32+(al&bl)