我在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
答案 0 :(得分:6)
我也很想知道这是我在这里落地的原因。我做了一点研究并找出了行为。基本上 JavaScript 将操作数和移位值视为位序列而不是数字。它适用于32位整数(浮点数被截断),最大移位为32位。如果我们移动一个大于32的数字,所有的位都会移出,导致零。为了确保移位小于或等于32,JavaScript会截断5个最低有效位[a << (b&0x1F)
],或者可能使用模数方法[a << (b%32)
],这会产生相同的结果。
如果不这样做,可以将您正在移位的负数视为一个位序列,而不是负数(即-1)。在这种情况下b = -1 = 0xFFFFFFFF
。由于此数字大于32,因此会被截断0xFFFFFFFF & 0x1F = 31
或0xFFFFFFFF % 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部分。