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