在Javascript中使用负移位计数左移

kau*_*tta 6 javascript bitwise-operators

我在Javascript注意到的一件事 -

a << -1

Returns 0 when a = even.
Returns -2147483648 when a = odd.
Run Code Online (Sandbox Code Playgroud)

同样,当-1更改为某个其他-ve数字时,将返回不同的值.有人可以解释引擎盖下正在进行的操作吗?或者行为未定义?

谢谢

编辑

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

-2 = 1110.之后,使用零填充右移,应该给出0111 = 7

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

Sub*_*box 6

我也想知道这是我在这里登陆的原因.我做了一点研究并找出了行为.本质上,JavaScript将操作数和移位值视为位序列而不是数字.它适用于32位整数(浮点数被截断),最大移位为32位.如果我们移动一个大于32的数字,所有的位都会移出,导致零.为确保移位小于或等于32,JavaScript会截断5个最低有效位[ a << (b&0x1F)]或可能使用模数方法[ a << (b%32)],从而产生相同的结果.

如果不这样做,请将您正在移位的负数视为一个位序列,而不是负数(即-1).在这种情况下b = -1 = 0xFFFFFFFF.由于此数字大于32,因此会被截断0xFFFFFFFF & 0x1F = 310xFFFFFFFF % 32 = 31.

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


kau*_*tta 0

得到了我问题第二部分的答案,即-2 >>> 1 = 7

JavaScript 总是处理 32 位。所以当我这样做时-2 >>> 1,真正发生的事情是 - 11111111111111111111111111111110 >>> 1这给出了01111111111111111111111111111111 = (2147483647)base10