JS 位运算符
1.简介
位运算是低级的运算操作,所以其速度往往也是相对较快的。同时,借助位运算的特性还可以实现一些算法,恰当地使用位运算有很多好处。
注意:所有的位运算都是在二进制下进行运算的!
2.位运算符
位运算符分为两种,位逻辑运算符与位移运算符:
下面是位逻辑运算符的逻辑结果参照:
3.位运算符的使用
3.1 取反 ~
语法:~a
其效果是将后面的值转为二进制,然后按位反转。
在实际开发中,其的使用往往涉及到数组:
// 根据某个条件,找到数组中符合条件的项的索引
const index = list.findIndex((item) => {
item.xxx === yyy;
})
// 如果此时找到了,则直接使用index即可;但如果此时未找到指定项,应该如何判断?
// 若未找到,则index为-1,将其取反 ~index = 0;若找到了,则index为非负数,其取反后必为负数!
// 所以此时可以通过if判断index取反后的值来判断是否找到指定元素
if (~index) {
...
} else {
...
}
3.2 左移 <<
语法:a << b
其效果是,将a
的各二进制位全部左移b
位,高位丢弃、低位补0。
例:6 << 2 = 24
0000 0000 0000 0000 0000 0000 0000 0110 -> 6
0000 0000 0000 0000 0000 0000 0001 1000 -> 6 << 2 = 24
可以看到,其结果实际上可以理解为:6 * (2 ^ 2) = 24
因此,在实际使用中,左移运算符常常用来做a * (2 ^ b)
的运算,因为其是直接通过二进制来进行运算,效率会更高!
3.3 右移 >>
语法:a >> b
其效果是,将a
的各二进制位全部右移b
位,低位丢弃,正数高位补0,负数高位补1。
例:12 >> 2 = 3
0000 0000 0000 0000 0000 0000 0000 1100 -> 12
0000 0000 0000 0000 0000 0000 0000 0011 -> 12 >> 2 = 3
-12 >> 2 = -3
1111 1111 1111 1111 1111 1111 1111 0100 -> -12
1111 1111 1111 1111 1111 1111 1111 1101 -> -12 >> 2 = -3
与左移类似,我们也可以将上面的例子理解为:12 / (2 ^ 2) = 3
和-12 / (2 ^ 2) = -3
因此,在实际使用中,右移运算符常常用来做a / (2 ^ b)
的运算,同样地,效率会更高!
3.4 无符号右移 >>>
语法:a >>> b
其效果是,将a
的各二进制位全部右移b
位,低位丢弃,高位补0。
例:
12 >>> 2 = 3
0000 0000 0000 0000 0000 0000 0000 1100 -> 12
0000 0000 0000 0000 0000 0000 0000 0011 -> 12 >> 2 = 3
-12 >>> 2 = 1073741821
1111 1111 1111 1111 1111 1111 1111 0100 -> -12
0011 1111 1111 1111 1111 1111 1111 1101 -> -12 >> 2 = 1073741821
3.5 按位与 &
基本使用这里就不讨论了,这里补充几个按位与的特殊用法:
- 清零:将一个数和0进行按位与操作,结果为0
- 取一个数的指定位
- 判断一个数的奇偶性:
a & 1
,a 为奇数时结果为1,为偶数时结果为0