如何在javascript中对长度超过32位的变量执行按位和?

如何在javascript中对长度超过32位的变量执行按位和?,javascript,64-bit,bit-manipulation,Javascript,64 Bit,Bit Manipulation,我在javascript中有两个数字,我想对它们进行位和位。它们都有33位长 在C#中: 但在javascript中: ((4294967296 & 4294967296 )==0) is true 4294967296是((长)1)您可以将每个变量拆分为2个32位值(如高位字和低位字),然后对这两个变量对执行位操作 下面的脚本作为Windows.js脚本运行。您可以将WScript.Echo()替换为Web的alert() Javascript中有几个大整数库,但它们都不提供您目前

我在javascript中有两个数字,我想对它们进行位和位。它们都有33位长

在C#中:

但在javascript中:

 ((4294967296 & 4294967296 )==0) is true

4294967296是((长)1)您可以将每个变量拆分为2个32位值(如高位字和低位字),然后对这两个变量对执行位操作

下面的脚本作为Windows.js脚本运行。您可以将WScript.Echo()替换为Web的alert()


Javascript中有几个大整数库,但它们都不提供您目前需要的位操作。如果你有动力并且真的需要这个功能,你可以修改其中一个库并添加一个方法来实现。他们已经提供了一个很好的代码库来处理大量的数据

您可以在以下问题中找到Javascript中的BigInteger库列表:


这是一个用于任意大整数的有趣函数:

function BitwiseAndLarge(val1, val2) {
    var shift = 0, result = 0;
    var mask = ~((~0) << 30); // Gives us a bit mask like 01111..1 (30 ones)
    var divisor = 1 << 30; // To work with the bit mask, we need to clear bits at a time
    while( (val1 != 0) && (val2 != 0) ) {
        var rs = (mask & val1) & (mask & val2);
        val1 = Math.floor(val1 / divisor); // val1 >>> 30
        val2 = Math.floor(val2 / divisor); // val2 >>> 30
        for(var i = shift++; i--;) {
            rs *= divisor; // rs << 30
        }
        result += rs;
    }
    return result;
}
函数按位和大(val1,val2){
var移位=0,结果=0;
变量掩码=~(~0)>30
val2=数学地板(val2/除数);//val2>>>30
对于(var i=shift++;i--;){

rs*=除数;//rs最简单的按位和,最多可使用JavaScript的最大数

由于内部原因,JavaScript的最大整数值是2^53(这是一个双浮点数)。如果您需要更多,有很多好的库来处理这个大整数

2^53是9007199254740992,约9000万亿(~9万亿)


您能举一个拆分的例子吗?谢谢!紧急通知-您必须记住Javascript不支持数字中的64位真值,最大53位。因为它使用float64(double)对任何整数进行运算。请参见,对于-2^32(但不完全是-2^32)左右的值,此操作仍然失败。我找不到解决方案。将
hi
部分四舍五入只对少数值有效。
hi
在应该是-2或什么的时候倾向于保持在-1。我用javascript做了一个快速测试,它对a=114287881752716 b=0x0FFFFFFF0000不起作用。太棒了!你有按位或的函数吗?我想是的您只需将单个
&
更改为
|
var-rs=(mask&val1)和(mask&val2);
更改为
var-rs=(mask&val1)|(mask&val2)
。函数很棒,但我无法让它使用32位或更高。谢谢,但是如果函数没有按照广告中的方式工作,难道不应该进行下一票吗?哪些操作不起作用(例如
val1
val2
的值,函数的结果,以及您期望从函数中得到的值)?@palswim,惊人的解决方案挂钩它不起作用:位和位(114287881752716,0x0FFFFFFF0000)
var a = 4294967296;
var b = 4294967296;

var w = 4294967296; // 2^32

var aHI = a / w;
var aLO = a % w;
var bHI = b / w;
var bLO = b % w;

WScript.Echo((aHI & bHI) * w + (aLO & bLO));
function BitwiseAndLarge(val1, val2) {
    var shift = 0, result = 0;
    var mask = ~((~0) << 30); // Gives us a bit mask like 01111..1 (30 ones)
    var divisor = 1 << 30; // To work with the bit mask, we need to clear bits at a time
    while( (val1 != 0) && (val2 != 0) ) {
        var rs = (mask & val1) & (mask & val2);
        val1 = Math.floor(val1 / divisor); // val1 >>> 30
        val2 = Math.floor(val2 / divisor); // val2 >>> 30
        for(var i = shift++; i--;) {
            rs *= divisor; // rs << 30
        }
        result += rs;
    }
    return result;
}
// Works with values up to 2^53
function bitwiseAnd_53bit(value1, value2) {
    const maxInt32Bits = 4294967296; // 2^32

    const value1_highBits = value1 / maxInt32Bits;
    const value1_lowBits = value1 % maxInt32Bits;
    const value2_highBits = value2 / maxInt32Bits;
    const value2_lowBits = value2 % maxInt32Bits;
    return (value1_highBits & value2_highBits) * maxInt32Bits + (value1_lowBits & value2_lowBits)
}