在JS中,我们遇到以下情况:
<<
运算符:
3 << 1 // 6
5 << 1 // 10
7 << 1 // 14
-3 << 1 // -6
-5 << 1 // -10
-7 << 1 // -14
>>
运算符:
3 >> 1 // 1
5 >> 1 // 2
7 >> 1 // 3
-3 >> 1 // -2
-5 >> 1 // -3
-7 >> 1 // -4
如您所见,对于<<
运算符,对于小于2 ** 32的值,我们有abs(X << Y) === abs(-X << Y)
。
对于>>
运算符,为什么这不成立?
答案 0 :(得分:5)
因为您要旋转这些数字的二进制表示形式。负数存储为 2's complement binary
因此(出于说明目的,仅使用8位):
-3 = 11111101
如果您旋转>>
,这是符号传播,您将得到:
11111110 = -2
因为符号传播移位会将符号位复制到最左侧的位。
使用正数更容易:
3 = 00000011
使用>>
进行移位后(由于它为正,因此您将移位为零)
00000001 = 1
答案 1 :(得分:0)
这是因为减号比移位运算符少greater precedence。
因此,-3 >> 1
将以(-3) >> (1)
的身份运行,而不是以-(3 >> 1)
的身份运行。