JS 位移运算符 '>>' 没有返回正确的结果

JS bitwise shift operator '>>' not returning the correct result

我在 JS 中发现了这个奇怪的问题。我有一些本机绑定到棋盘游戏 api,它使用位板来表示游戏状态。 我正在尝试在 JS 中操作这些位板以在基于 Web 的 GUI 中显示结果(使用电子)。

位板上的1代表棋子的位置。这是一个例子:

const bitboard = 0b100000010000000000000000000000000000;

但是,当我执行 bitboard >>= 1; 时,值神奇地变成了 0b1000000000000000000000000000

可运行示例:

const bitboard = 0b100000010000000000000000000000000000; // 0b is binary literal
console.log(bitboard.toString(2));
console.log((bitboard >> 1).toString(2)); // .toString(2) prints the number in binary

编辑: 相同的代码在 Rust 中工作,这是我在本机端使用的语言。

某处可能有重复项,但这里的解决方案是使用 BigInt

BigInt is a built-in object that provides a way to represent whole numbers larger than 253 - 1, which is the largest number JavaScript can reliably represent with the Number primitive and represented by the Number.MAX_SAFE_INTEGER constant. BigInt can be used for arbitrarily large integers.

您只需确保 right-shift 运算符的两个操作数类型相同。

const bitboard = BigInt("0b100000010000000000000000000000000000")
console.log(bitboard.toString(2))
console.log((bitboard >> 1n).toString(2)) // note "1n"

JavaScript 可以 bit-shift 的数值类型是有限制的。使用 Node,我在此处找到了 32 位的 cut-off:

0b10000000000000000000000000000000 >>> 1 // 32 bits
# => 1073741824
0b100000000000000000000000000000000 >>> 1 // 33 bits
# => 0

它刚出故障的地方。您的二进制值超过了该阈值,因此您无法使用 JavaScript 的默认表示法对其进行移动。

您可以使用 BigInt:

BigInt('0b100000010000000000000000000000000000') >> BigInt(1)
# => 17314086912n

这是正确的值。