Javascript JS位移位运算符'&燃气轮机&燃气轮机';没有返回正确的结果

Javascript JS位移位运算符'&燃气轮机&燃气轮机';没有返回正确的结果,javascript,bitwise-operators,Javascript,Bitwise Operators,我在JS中发现了这个奇怪的问题。我有一些与棋盘游戏api的本机绑定,该api使用比特板表示游戏状态。 我试图在JS中操纵这些位板,以便在基于web的GUI(使用electron)中显示结果 位板中的1s表示工件的位置。以下是一个例子: const bitboard=0b10000000000000000000000; 但是,当我执行位板>>=1时,值会神奇地变成0b1000000000000000000000 可运行示例: const bitboard=0b10000000000000000

我在JS中发现了这个奇怪的问题。我有一些与棋盘游戏api的本机绑定,该api使用比特板表示游戏状态。 我试图在JS中操纵这些位板,以便在基于web的GUI(使用electron)中显示结果

位板中的
1
s表示工件的位置。以下是一个例子:

const bitboard=0b10000000000000000000000;
但是,当我执行
位板>>=1时
,值会神奇地变成
0b1000000000000000000000

可运行示例:

const bitboard=0b10000000000000000000000;//0b是二进制文字
console.log(bitboard.toString(2));

console.log((bitboard>>1.toString(2));/。toString(2)以二进制形式打印数字
可能在某个地方有重复的浮动,但这里的解决方案是使用

BigInt
是一个内置对象,它提供了一种表示大于253-1的整数的方法,这是JavaScript可以用
number
原语可靠表示的最大数,并由
number.MAX\u SAFE\u INTEGER
常量表示
BigInt
可用于任意大的整数

只需确保右移位运算符的两个操作数的类型相同

const bitboard=BigInt(“0b10000000000000000000000”)
console.log(bitboard.toString(2))

console.log((bitboard>>1n.toString(2))//注意“1n”
JavaScript可以位移位的数值类型有限制。使用Node,我在这里找到了32位的截止值:

0b10000000000000000000000000000000 >>> 1 // 32 bits
# => 1073741824
0b100000000000000000000000000000000 >>> 1 // 33 bits
# => 0
在那里它只是崩溃了。您的二进制值超过了该阈值,因此无法使用JavaScript的默认表示来移动它

您可以通过以下方式执行此操作:


这是正确的值。

JavaScript的“数字”在内部都是浮点型的,所以你可以得到很多奇怪的值,比如>~2^28。您可能需要
>>
,它是“零填充右移运算符”。提示:只需删除字符串表示形式的最后一个字符。按位运算符使用32位值-您有36bits@JaromandaX通过测试,我发现断点是29位,所以近似值很接近。这是专门用于位移位的,不是通用数字。@JaromandaX误读了数字。谢谢!JS对int和float没有单独的类型,这有点奇怪。@LuketheGeek-嗯。。。它是在11天内写成的:p
我在这里找到了截止值
——32位。。。。不是你在你的生活中说的28/29comments@JaromandaX我想我不擅长数数。无论如何,这是一个转折点。
BigInt('0b100000010000000000000000000000000000') >> BigInt(1)
# => 17314086912n