首页 > 解决方案 > 为什么 -3 >> 1 等于 -2?

问题描述

在 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).

为什么这对>>运营商不适用?

标签: javascript

解决方案


因为您正在旋转这些数字的二进制表示。并且负数存储为2 的补码二进制

所以(出于说明目的仅使用 8 位):

-3 = 11111101

如果您旋转>>哪个符号传播,您将获得:

11111110 = -2

因为符号传播移位将符号位复制到最左边的位。

使用正数更容易:

3 = 00000011

移位后>>(因为它是正数,所以你在零移位)

00000001 = 1


推荐阅读