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

时间:2013-05-15 08:12:05

标签: javascript bitwise-operators

我在Javascript注意到的事情 -

a<< -1

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

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

由于

修改

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

  

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

a = -2; console.log(a >>> 1); 回报 2147483647

3 个答案:

答案 0 :(得分: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或({{1} })取决于操作数是否设置了1位(奇数或偶数)。

答案 1 :(得分:0)

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

Javascript始终处理32位。因此,当我-2 >>> 1时,真正发生的事情是 - 11111111111111111111111111111110 >>> 1 01111111111111111111111111111111 = (2147483647)base10

答案 2 :(得分:0)

LeftShift运算符在数字的二进制表示的右侧添加零,将位移到左侧。仅使用加法表达式的5个最低有效数字。所以:

var x = 5         // 101

alert( x << 1  ); // 1010 = 10

alert( x << 2  ); // 10100 = 20

alert( x << 3  ); // 101000 = 40

alert( x << 4  ); // 1010000 = 80

alert( x << 64 ); // 101 = 5

最后一个表达式返回5,因为shift仅使用加法表达式的最后5位,即1000000,因此仅使用00000部分。