在联合来文中,我们有以下情况:
<<操作符:
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)。
为什么对于>>操作符来说,这种情况不成立呢?
发布于 2018-11-06 18:43:03
因为你在旋转这些数字的二进制表示。负数存储为https://en.wikipedia.org/wiki/Two%27s_complement
因此(仅使用8位进行说明):
-3 = 11111101
如果您与正在进行符号传播的>>一起旋转,您将得到:
11111110 = -2
因为传播移位的符号将符号位复制到最左边的位。
有了正数,就更容易了:
3 = 00000011
使用>>移位后(因为它是正的,所以您将移到零)
00000001 = 1
发布于 2018-11-06 18:47:20
这是因为减号有更大优先而不是移位操作符。
因此,-3 >> 1将以(-3) >> (1)的形式运行,而不是以-(3 >> 1)的形式运行。
https://stackoverflow.com/questions/53177845
复制相似问题