Как сделать побитовое И в 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)
}