- 位运算的基本类型
- 一元
~
(按位求补)运算符 - 二进制
<<
(左移) 、>>
(右移) 和>>>
(无符号右移)运算符 - 二进制
&
(逻辑 AND)、|
(逻辑 OR)和^
(逻辑异或)运算符
求数组一半长度,遇到奇数则舍去小数
halfLen = a.length >> 1; 5>>1//2
不过需要注意右移运算符>>优先级别加号+还低。 因此在于其他操作符号想结合时候可以适当增加括号,例如求中位
mid = left + (right - left >> 1);
mid = left + ~~((right - left) / 2);
不建议使用mid = (left + right)>>1
;,因为加号操作可能造成溢出舍弃小数,保留整数位
halfLen = ~~(a.length / 2);
halfLen = a.length / 2 | 0;
判断奇偶
evenNum & 1 === 0;
// 偶数
oddNum & 1 === 1;
// 奇数
善用异或(相同为0,不同为1)
5 ^ 5;
// 0
5 ^ 5 ^ 6 ^ 6 ^ 7;
// 7
-
判断数是否是2的幂次方(注意0也会被判为true)
num & (num - 1) === 0;
翻转数的第K位
num ^= 1 << k;
将第K位设为0
num &= ~(1 << k);
将第K位设为1
num |= 1 << K;
判断第K位是否为0
num & 1 << k === 0;