【问题标题】:Is there a way to efficiently perform bitwise operations on 64 bit bit-strings in Javascript?有没有办法在 Javascript 中有效地对 64 位位串执行按位运算?
【发布时间】:2020-02-05 21:24:33
【问题描述】:

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

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

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

【问题讨论】:

  • 位运算符对 32 位数字进行运算。即使支持64位,字符串也会先转成数字,Number("1010")0b1010不一样。

标签: javascript bit-manipulation bitwise-operators


【解决方案1】:

由于在 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 类型的数字。

【讨论】:

  • 位串中的“b”是什么意思?
  • 前缀0b表示后面的数字是二进制表示。同样,0xhexadecimal 文字的前缀。
  • 当处理更长的序列或多个位串时,每个位串都已知不超过 64 位,请考虑BigUint64Array
【解决方案2】:

这里有一些蛮力:)

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

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 2012-12-30
    • 2015-09-13
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    相关资源
    最近更新 更多