Как сделать побитовое И в javascript для переменных длиной более 32 бит?

У меня есть 2 числа в javascript, которые я хочу бить и. Они оба имеют длину в 33 бита

в С#:

 ((4294967296 & 4294967296 )==0) is false

но в javascript:

 ((4294967296 & 4294967296 )==0) is true
<p> 4294967296 вл етс ((длинным) 1) < 32

Как я понимаю, это связано с тем, что javascript преобразует значения в int32 при выполнении бит-мутных операций.

Как мне обойти это? Любые предложения о том, как заменить бит и с помощью набора других математических операций, чтобы биты не были потеряны?

Ответ 1

Вы можете разделить каждый из варов на 2 32-битных значения (например, высокое слово и низкое слово), а затем выполнить поразрядную операцию для обеих пар.

Ниже приведено script как Windows.js script. Вы можете заменить WScript.Echo() на alert() для Web.

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));

Ответ 2

Здесь функция fun для сколь угодно больших целых чисел:

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;
}

Предполагая, что система обрабатывает по меньшей мере 30-битные побитовые операции.

Ответ 3

В JavaScript есть несколько BigInteger librairy, но ни один из них не предлагает побитную операцию, которая вам нужна в данный момент. Если вы мотивированы и действительно нуждаетесь в такой функциональности, вы можете изменить одну из этих librairy и добавить метод для этого. Они уже предлагают хорошую базу кода для работы с огромным количеством.

Вы можете найти список BigInteger librairy в Javascript в этом вопросе:

Огромная Целочисленная библиотека JavaScript

Ответ 4

Простейший бит-мудрый И, который работает до максимального количества JavaScript

Максимальное целочисленное значение JavaScript max составляет 2 ^ 53 по внутренним причинам (это двойной поплавок). Если вам нужно больше, есть хорошие библиотеки для этой большой цельной обработки.

2 ^ 53 - 9 007 199 254 740 992, или около 9000 триллионов (~ 9 квадриллионов).

// 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)
}