使用>>> =运算符0的用例是什么? (无符号右位移)

时间:2017-07-06 10:54:30

标签: javascript bit-shift

我最近遇到了一段使用>>>=运算符的奇怪代码(我稍后会在问题中显示)。

>>>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位并使其无符号。

还有其他用例吗?

0 个答案:

没有答案