我最近遇到了一段使用>>>=
运算符的奇怪代码(我稍后会在问题中显示)。
>>>
是unsigned right bit shift运算符,如What is the JavaScript >>> operator and how do you use it?
mozilla documentation将运营商描述为......
a >>> b
将二进制表示a
(< 32)位向右移b
,丢弃移位的位,并从左移零。
鉴于这些知识,我假设>>>=
是就地无符号右移位运算符。
还记得我刚开始提到的那段代码吗?这是......
(number) => {
number >>>= 0;
// Do stuff with number...
}
我非常好奇为什么有人会使用0
执行就地位移。
有什么用例?
为了回答我的问题,我编写了一个快速脚本,它将迭代所有无符号的32位整数,并将整数与其对齐(无符号右移0)对应。
"use strict";
const assertEqual = (a, b, message) => {
if (a !== b) {
throw message
}
}
const START = 0
const END = Math.pow(2, 32) - 1
for (let n = START; n < END; n++) {
let nShifted = n
nShifted >>>= 0
const message = n + " !== (" + n + " >>>= 0) (which is " + nShifted + ")"
assertEqual(n, nShifted, message)
}
console.log("done.")
正如预期的那样,程序没有例外,因为0位移位没有效果。
但是,如果任何值为负数,则会抛出异常。
执行转换似乎会将结果截断为32位整数,这并不令人惊讶。
似乎在移动负整数时,结果是两个补码,这是有道理的,因为它使值无符号。
例如......
x = -1
console.log(x.toString(2)) // '-1'
x >>>= 0
console.log(x.toString(2)) // '11111111111111111111111111111111'
// (Two's complement of -1)
例如......
x = 2.6
x >>>= 0
console.log(x) // '2'
就地向右移位0整数将其截断为32位并使其无符号。
还有其他用例吗?