位运算是基于整数的二进制表示进行的运算。
由于计算机内部就是以二进制来存储数据,位运算是相当快的。
计算机对二进制进行的运算(+、-、*、/)都叫位运算。

基本的6种位运算: 按位与、按位或、按位异或、按位取反、左移和右移。

与、或、异或

运算 运算符 数学符号表示 解释
& &、and 只有两个对应位都为1时才为1
异或 ^ ^、xor 只有两个对应位不同时才为1

异或运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即 a ^ b ^ b = a

取反

取反是对一个数 num 进行的位运算,即单目运算。

取反暂无默认的数学符号表示,其对应的运算符为 ~。
它的作用是把 num 的二进制补码中的 0 和 1 全部取反(0 变为 1,1 变为 0)。
有符号整数的符号位在 ~ 运算中同样会取反。

补码:在二进制表示下,正数和 0 的补码为其本身,负数的补码是将其对应正数按位取反后加一。

左移和右移

num << i 表示将 num 的二进制表示向左移动 i 位所得的值.
num >> i 表示将 num 的二进制表示向右移动 i 位所得的值.

eg
num << 1 ——> num*2
num >> 1 ——> num/2
注:/是向0取整,而右移>>是向下取整
即当数大于等于0时两种方法等价;当数小于0时会有区别,如: -1/2的值为0 ,而 -1 >> 1 的值为-1

b&1相当于b%2,b>>=1相当于b/=2;

性质

优先级

应用

高效运算

表示集合

(状压DP)

2的幂

取绝对值

取两个数的最大/小值

判断两非零数符号是否相同

交换两个数