位运算概述

从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。

| 符号 | 描述 | 运算规则 |

& 与 两个位都为1时,结果才为1

| 或 两个位都为0时,结果才为0

^ 异或 两个位相同为0,相异为1

~ 取反 0变1,1变0

<< 左移 各二进位全部左移若干位,高位丢弃,低位补0

右移 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)

指定位置的位运算

  1. 将 x 最右边的 n 位清零:x & (~0 << n)
  2. 获取 x 的第 n 位值(0 或者 1):(x >> n) & 1
  3. 获取 x 的第 n 位的幂值:x & (1 << n)
  4. 仅将第 n 位置为 1:x | (1 << n)
  5. 仅将第 n 位置为 0:x & (~ (1 << n))
  6. 将 x 最高位至第 n 位(含)清零:x & ((1 << n) - 1)

实战位运算要点

  1. 判断奇偶:

    • x % 2 == 1 —> (x & 1) == 1
    • x % 2 == 0 —> (x & 1) == 0
  2. x >> 1 —> x / 2.

    即:x = x / 2; —> x = x >> 1;

    mid = (left + right) / 2; —> mid = (left + right) >> 1;

  3. X = X & (X-1)清零最低位的 1

  4. X & -X=> 得到最低位的 1

  5. X & ~X=> 0