javascript - 在 Javascript 中以负移位计数左移

标签 javascript bitwise-operators

我在 Javascript 中注意到的一件事 -

一个<< -1

Returns 0 when a = even.
Returns -2147483648 when a = odd.

同样,当-1 更改为其他一些-ve 数字时,返回不同的值。 有人可以解释引擎盖下发生了什么位操作吗?还是行为未定义?

谢谢

编辑

也不应该用零填充右移,即 -2 >>> 1 返回 7 吗?

-2 = 1110. After, right shift with zero-fill, it should give 0111 = 7

但是 a = -2; console.log(a >>> 1); 返回 2147483647

最佳答案

我也很想知道我是怎么来到这里的。我做了一些研究并弄清楚了行为。本质上,JavaScript 将操作数和移位值视为位序列而不是数字。它适用于 32 位整数( float 被 chop )并且最大移位为 32 位。如果我们移动一个大于 32 的数字,所有的位都会移出,结果为零。为确保移位小于或等于 32,JavaScript chop 了 5 个最低有效位 [ a << (b&0x1F) ] 或者可能使用模数方法 [ a << (b%32) ] 产生相同的结果。

顺便说一句,将要移动的负数视为一个位序列,而不是负数(即 -1)。在这种情况下 b = -1 = 0xFFFFFFFF .由于此数字大于 32,因此被 chop 0xFFFFFFFF & 0x1F = 310xFFFFFFFF % 32 = 31 .

因此,在您的示例中,“a”从最低有效位一直移位到最高有效位(符号位)。因此,移位的结果是 0x00000000 或( 0x80000000 = -2147483648 ),具体取决于操作数是否设置了 1 位(奇数或偶数)。

关于javascript - 在 Javascript 中以负移位计数左移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16559921/

相关文章:

javascript - 与 0b 的按位或运算将给定数字转换为负数

javascript - 在javascript中获取日期差异

javascript - 如何保持一个div的右边缘与另一个div的右边缘相同

c 从缓冲区读取 4 字节小端序号的代码

ruby - 类型错误 : wrong argument type with Ruby &~ operator

python - 使用按位运算将两个整数相加时无限循环?

javascript - Sylius:如何修改/自定义app.js?

HTML 正文中没有函数调用的 JavaScript 函数调用?

javascript - 让显示隐藏功能正常工作的问题

c - 如何选择第一个(第一个)数字作为数字的掩码