Есть ли способ эффективно выполнять побитовые операции над 64-битными битовыми строками в Javascript? - PullRequest
2 голосов
/ 05 февраля 2020

В недавнем проекте это включало выполнение операции "или" для 2-х 64-битных битовых строк, но я столкнулся с проблемой, если бы строки были достаточно большими, любая битовая операция вернула бы 0, например: (это следующее Примером может быть не 64-битная битовая строка, но она достаточно длинна для получения одинаковых результатов).

console.log("10101001010100101010101001010000001010100101010010"|"000100101010100101001010101001010101010100101010010100"); 
// returns 0

Есть ли какой-нибудь специальный метод, который я мог бы написать для эффективных побитовых операций в Javascript, или способ, которым я мог бы представлять эти битовые строки по-разному? Если вам нужны какие-либо разъяснения по этому вопросу, не стесняйтесь спрашивать.

Ответы [ 2 ]

3 голосов
/ 05 февраля 2020

С момента введения BigInt в EcmaScript вы можете делать следующее:

let a = BigInt("0b10101001010100101010101001010000001010100101010010");
let b = BigInt("0b000100101010100101001010101001010101010100101010010100");

console.log((a|b).toString(2));

Это то, что вы будете делать, когда ввод происходит в некотором текстовом формате. Однако, если вы просто хотите, чтобы он был жестко запрограммирован в JavaScript, вы также можете использовать буквенное обозначение (с суффиксом n):

let a = 0b10101001010100101010101001010000001010100101010010n;
let b = 0b000100101010100101001010101001010101010100101010010100n;

console.log((a|b).toString(2));

Обратите внимание, что вызов .toString(2) предназначен только для отображения двоичного представления; выражение a|b действительно является числом типа bigint.

1 голос
/ 05 февраля 2020

Вот какая-то грубая сила:)

function largeBitwiseOr(s1, s2) {
  const padded1 = s1.padStart(64, '0');
  const padded2 = s2.padStart(64, '0');
  const left1 = parseInt(padded1.substr(0, 32), 2);
  const left2 = parseInt(padded2.substr(0, 32), 2);
  const right1 = parseInt(padded1.substr(32, 32), 2);
  const right2 = parseInt(padded2.substr(32, 32), 2);
  const leftResult = (left1 | left2).toString(2);
  const rightResult = (right1 | right2).toString(2).padStart(32, '0');
  return leftResult + rightResult;
}

const string1 = "100000000000000000000000000000000000010";
const string2 = "010000000000000000000000000000000000001";
const string1or2 = largeBitwiseOr(string1, string2);
console.log(string1);
console.log(string2);
console.log(string1or2);
...