首页 > 解决方案 > JS 位移运算符 '>>' 没有返回正确的结果

问题描述

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

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

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 中工作,这是我在本机端使用的语言。

标签: javascriptbitwise-operators

解决方案


可能有一个重复的地方漂浮在某个地方,但这里的解决方案是使用BigInt

BigInt是一个内置对象,它提供了一种表示大于 2 53 - 1 的整数的方法,这是 JavaScript 可以用Number原语可靠地表示并由Number.MAX_SAFE_INTEGER常量表示的最大数。BigInt可用于任意大的整数。

您只需要确保右移运算符的两个操作数是相同的类型。

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


推荐阅读