有没有一种方法可以有效地对 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);
在最近的一个项目中,它涉及到对 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);