有没有办法在 Javascript 中有效地对 64 位位字符串执行按位运算?



在最近的一个项目中,它涉及对 2 个 64 位位字符串执行"or"操作,但我遇到了一个问题,如果字符串足够大,任何按位操作都会返回 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);

最新更新