javascript - 为了将按位运算保持为无符号 32 位,>>> 0 是否合法?
问题描述
例如,这-1
又0xFFFFFFFF
称为带符号的 32 位:
0xFFFFF000 | 0xFFF
但是,这就是4294967295
无0xFFFFFFFF
符号的 32 位:
(0xFFFFF000 | 0xFFF) >>> 0
我可以依靠使用此>>> 0
技巧将按位运算保持为无符号 32 位吗?
规范 [1] 中没有任何内容表明这应该失败,并且在一些简单的测试中似乎可以正常工作......
[1] https://www.ecma-international.org/ecma-262/9.0/index.html#sec-unsigned-right-shift-operator
解决方案
根据MDN(重点是我的):
此运算符将第一个操作数向右移动指定的位数。右移的多余位被丢弃。零位从左边移入。符号位变为 0,因此结果始终为非负数。与其他按位运算符不同,零填充右移返回一个无符号 32 位整数。
所以听起来你可以指望它总是有效的。
同样来自ECMAScript 规范第 12.9.5.1 #8 节(再次强调是我的):
通过 shiftCount 位返回执行 lnum 的零填充右移的结果。空出的位用零填充。结果是一个无符号的 32 位整数。
推荐阅读
- python - 如何编写符合 ASGI 的中间件(同时保持与框架无关)?
- python - 将两个不同的数据集彼此相邻绘制时的一个颜色条
- python - Pandas Dataframe 列名在输出中多次显示
- flutter - 如何在颤动中合并图像文件和音频文件?与 Instagram 故事中的相同
- html - 如何使用 css 更改 div 文本的字体粗细?
- android - 在 Seekbar 中使用 secondaryProgressTint 的目的是什么?
- android - Jetpack Compose:即使主题很暗,文本仍保持黑色
- javascript - 如何使用中间件组件正确导出组件?
- reactjs - 使用 axios 调用 API 端点以更新 React 中的组件时,如何避免无限递归循环
- java - MariaDB 驱动程序不支持从 DB 读取 Instant,但支持写入