在 ECMAScript 2020 中,新增加了两个新的移位运算符:有符号左移(<<)和无符号右移(>>>)。这两个运算符在 JavaScript 中的使用场景相对较少,但是对于算法实现或者某些位运算场景,这两个运算符可以大大减少代码的复杂度和提高执行效率。
什么是有符号左移和无符号右移?
移位运算是指将二进制数中的所有位向左或向右移动指定的位数,根据移动方向不同,移位运算分为左移和右移。在 JavaScript 中,左移运算符用两个箭头(<<)表示,右移运算符用三个箭头(>>>)表示。
对于一个有符号整数(正数或负数),有符号左移相当于将整个数的二进制表示左移指定的位数,并在右边添加 0。例如,10 的二进制表示为 1010,将其有符号左移两位变成 101000,即将原数值的二进制表示左移两个位置,右边补 0。
对于一个无符号整数(只能为正数),无符号右移相当于将整个数的二进制表示右移指定的位数,并在左边添加 0。例如,10 的二进制表示为 1010,将其无符号右移两位变成 0010,即将原数值的二进制表示右移两个位置,左边补 0。
移位运算的使用场景
位运算
在计算机领域,二进制的位运算是一种非常常用的操作方式。而在位运算中,移位操作是其中最基本的操作之一。例如,可以通过位运算将一个十六进制颜色值转换为 RGB 值,或者实现 CRC 校验等算法。
代码优化
对于复杂的数学运算等操作,使用移位运算比使用乘除等运算可以提高代码的执行效率。移位运算可以减少浮点数的运算,加速代码的执行速度。
压缩数据
移位运算还可以用于压缩数据。例如,在压缩文件等操作中使用到的 Huffman 编码算法中就用到了移位运算来压缩数据。
如何使用移位运算符
使用移位运算符非常简单,只需要在需要进行位移的数值前添加左移(<<)或右移(>>>)运算符,并指定需要移动的位数即可。例如:
let a = 10; // 1010 let b = a << 2; // 101000 let c = a >>> 2; // 10
在上面的代码中,我们首先定义了一个变量 a,它的二进制表示为 1010。然后我们使用左移(<<)运算符将 a 左移两位,得到的结果为 101000,即 40。我们还使用右移(>>>)运算符将 a 右移两位,得到的结果为 10,即 2。
注意事项
使用移位运算符时需要注意以下问题:
- 有符号左移和无符号右移只能用于整数的位运算,不能用于浮点数或者其他类型的数据。
- 对于负数,有符号左移和右移的结果是不被定义的,应该避免使用。推荐先进行转换,再进行位移操作。
- 移动的位数必须是一个整数,否则会抛出异常。
总结
在 ECMAScript 2020 中,新增加的有符号左移和无符号右移运算符在 JavaScript 开发中的使用场景相对较少。但是,对于算法实现或者某些位运算场景,这两个运算符可以大大减少代码的复杂度和提高执行效率。在使用时需要注意避免出现负数和使用非整数的位移数。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654775f67d4982a6eb1d3078