javascript - 为什么 -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)
.
为什么这对>>
运营商不适用?
解决方案
因为您正在旋转这些数字的二进制表示。并且负数存储为2 的补码二进制
所以(出于说明目的仅使用 8 位):
-3 = 11111101
如果您旋转>>
哪个符号传播,您将获得:
11111110 = -2
因为符号传播移位将符号位复制到最左边的位。
使用正数更容易:
3 = 00000011
移位后>>
(因为它是正数,所以你在零移位)
00000001 = 1
推荐阅读
- sqlite - Docker 命名空间阻止 sqlite3 数据库访问
- reactjs - JvectorMap在setState reactjs之后重新渲染正确的标记
- purescript - 查找某个类的所有实例
- javascript - 如何动态获取状态数组名称 React
- mule - 如何解决错误匹配通配符严格,但找不到元素'ss:authentication-manager'的声明?
- android - 使用移动设备 GPS 更新 Windows 位置
- haskell - 列表理解和过滤元素
- amazon-web-services - 如何在 mulesoft sqs 接收请求中设置“WaitTimeSeconds”
- sql - 用于列出用户、角色并将用户添加到 Azure SQL DB 的 PowerShell 脚本
- ansible - 为什么将“ansible_python_interpreter”配置选项设置为“/usr/bin/python3”