javascript - JS 位移运算符 '>>' 没有返回正确的结果
问题描述
我在 JS 中发现了这个奇怪的问题。我有一些与棋盘游戏 api 的本机绑定,它使用位板来表示游戏状态。我正在尝试在 JS 中操作这些位板以在基于 Web 的 GUI 中显示结果(使用电子)。
位板上的1
s 代表棋子的位置。这是一个例子:
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
是一个内置对象,它提供了一种表示大于 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"
推荐阅读
- html - CR 中的跨文本对齐
- python - 用于使标准输出不起作用的 Python PyQt5 信号
- python - Django:注释不同表中两列的 Sum()
- angular - 添加 @agm/core 导入语句后的错误(Angular 7)
- javascript - 为什么不将 scrollIntoView 应用于 vuejs 中的选定元素?
- git - 如何使用 Pycharm 将我的基本 github 身份验证更改为 Git 操作的令牌身份验证要求
- c# - 无法使用 Selenium/c# 单击 Dynamics365 下拉菜单 - “ElementNotVisibleException”
- c - 指针在数组中的值是否持续存在
- microsoft-graph-api - Graph Copy文件操作需要共享OneDrive文件
- arrays - 数组类型不匹配