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
这是正确的值。
我在 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 theNumber
primitive and represented by theNumber.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
这是正确的值。