# 位运算简述
# 什么是位运算
程序中的数在计算机内存中都是以二进制的形式存储的,位运算就是对内存中的二进制数直接进行操作。由于位运算直接对内存数据进行操作,不需要转换成十进制,因此处理速度很快。
# 位运算操作符
- 与运算符(and) &: 两个位都是1时,结果为1,否则为0
10011
& 11001
------------
10001
- 或运算符(or) |: 两个位都是0时,结果才为0,否则为1
10011
& 11001
------------
11011
- 异或运算符(xor) ^: 两个位相同则为0,不同则为1
10011
& 11001
------------
01010
- 取反运算(not) ~: 0则变为1,1则变为0
~10011
------------
01100
- 左移运算(shl) <<: 向左进行移位操作,高位丢弃,低位补0
- 右移运算(shr) >>: 向右进行移位操作,无符号数,高位补0,有符号数,高位补符号树
# 常见的位运算应用
- 位移实现乘除
数num右移一位,相当于num/2;左移一位,相当于num*2
let num = 2;
num >> 1 // --> 1
num << 1 // --> 4
- 与运算判断奇偶
根据数的最后一位来判断,0是欧偶数,1为奇数
if(0===(num&1)){
// num 是偶数
}
- 正负数交换 整数取反加1,正好变成其对应的负数,负数取反加1,为其自己
~2+1 // --> -2
~(-2)+1 // --> 2
- 交换两数
使用临时变量
let temp = a;
a = b;
b = temp;
不使用临时变量
a = a + b;
b = a - b;
a = a - b;
位与操作
a ^= b; // --> a = a^b
b ^= a; // --> b = b^a^b = (b^b)^a = a
a ^= b; // --> a = a^b^a = (a^a)^b = b