JAVASCRIPT中的位运算
位运算符:
运算符 | 名称 | 操作 | 示例 |
---|---|---|---|
& | 位与 | 对整形数逐位执行与(AND)操作 | 0x1234 & 0x00ff === 0x34 |
| | 位或 | 对整形数逐位执行与(OR)操作 | 0x1234 & 0x00ff === 0x12FF |
~ | 位非 | 将操作数的所有为取反 | ~0xf === 0xffffffff0 |
^ | 位异或 | 对整形数逐位执行与(XOR)操作,相异为1 | 0xff00 ^ 0xf0f0 === 0x0ff0 |
<< | 左移 | 将一个操作数的所有二进制位进行左移操作,移动的位数由第二个操作数决定 | 7 << 2 === 28 |
>> | 带符号右移 | 将一个操作数的所有二进制位进行左移操作,移动的位数由第二个操作数决定, 符号位不改变 | -7 >> 1 === 4 |
>>> | 无符号右移 | 将一个操作数的所有二进制位进行左移操作,移动的位数由第二个操作数决定, 符号位补0 | -1 >>> 4 === 0x0FF |
组合位运算
符号 | 名称 | 示例 |
---|---|---|
~(a & b) | 位与非 | ~(0x7 & 0x6) === -2 |
~(a | b) | 位或非 | ~(0x7 | 0x6) === -8 |
~(a ^ b) | 同或 | 相同为1: ~(0x7 ^ 0x6) === -2 |
巧用位运算
- 使用按位非~判断索引存在: 这是一个很常用的技巧,如判断一个数是否在数组里面
~-1 === 0
if (~arr.indexOf(a)) {
}
- 使用异或交换两个数
- 使用按位与&去掉高位
- 使用按位与&进行标志位判断
- 使用按位|构造属性集
参考
位运算的使用练习