# 位运算简述

# 什么是位运算

  程序中的数在计算机内存中都是以二进制的形式存储的,位运算就是对内存中的二进制数直接进行操作。由于位运算直接对内存数据进行操作,不需要转换成十进制,因此处理速度很快。

# 位运算操作符

  1. 与运算符(and) &: 两个位都是1时,结果为1,否则为0
      10011
    & 11001
    ------------
      10001
  1. 或运算符(or) |: 两个位都是0时,结果才为0,否则为1
      10011
    & 11001
    ------------
      11011
  1. 异或运算符(xor) ^: 两个位相同则为0,不同则为1
      10011
    & 11001
    ------------
      01010
  1. 取反运算(not) ~: 0则变为1,1则变为0
     ~10011
    ------------
      01100
  1. 左移运算(shl) <<: 向左进行移位操作,高位丢弃,低位补0
  2. 右移运算(shr) >>: 向右进行移位操作,无符号数,高位补0,有符号数,高位补符号树

# 常见的位运算应用

  1. 位移实现乘除

数num右移一位,相当于num/2;左移一位,相当于num*2

    let num = 2;
    num >> 1   // --> 1
    num << 1   // --> 4
  1. 与运算判断奇偶

根据数的最后一位来判断,0是欧偶数,1为奇数

    if(0===(num&1)){
        // num 是偶数
    }
  1. 正负数交换 整数取反加1,正好变成其对应的负数,负数取反加1,为其自己
    ~2+1    // --> -2
    ~(-2)+1 // --> 2
  1. 交换两数

使用临时变量

    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