有没有一种方法可以有效地对 Javascript 中的 64 位位字符串执行按位运算?

Is there a way to efficiently perform bitwise operations on 64 bit bit-strings in Javascript?

在最近的一个项目中,它涉及到对 2 个 64 位位字符串执行 "or" 操作,但是我遇到了一个问题,如果字符串足够大,任何位操作都会 return 0,例如:(以下示例可能不是 64 位位串,但足够长以产生相同的结果)。

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

在 Javascript 中是否有我可以编写的自定义方法来实现高效的按位运算,或者我可以用不同的方式表示这些位串?如果您需要有关该问题的任何说明,请随时提出。

自从在 EcmaScript 中引入 BigInt,您可以执行以下操作:

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.

类型的数字

这是一些蛮力:)

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