首页 > 解决方案 > 为了将按位运算保持为无符号 32 位,>>> 0 是否合法?

问题描述

例如,这-10xFFFFFFFF称为带符号的 32 位:

0xFFFFF000 | 0xFFF

但是,这就是42949672950xFFFFFFFF符号的 32 位:

(0xFFFFF000 | 0xFFF) >>> 0

我可以依靠使用此>>> 0技巧将按位运算保持为无符号 32 位吗?

规范 [1] 中没有任何内容表明这应该失败,并且在一些简单的测试中似乎可以正常工作......

[1] https://www.ecma-international.org/ecma-262/9.0/index.html#sec-unsigned-right-shift-operator

标签: javascript

解决方案


根据MDN(重点是我的):

此运算符将第一个操作数向右移动指定的位数。右移的多余位被丢弃。零位从左边移入。符号位变为 0,因此结果始终为非负数。与其他按位运算符不同,零填充右移返回一个无符号 32 位整数

所以听起来你可以指望它总是有效的。

同样来自ECMAScript 规范第 12.9.5.1 #8 节(再次强调是我的):

通过 shiftCount 位返回执行 lnum 的零填充右移的结果。空出的位用零填充。结果是一个无符号的 32 位整数


推荐阅读