位运算就是基于整数的二进制表示进行的运算。由于计算机内部就是以二进制来存储数据,位运算是相当快的。
基本的位运算共 6 种,分别为按位与、按位或、按位异或、按位取反、左移和右移。
符号 | 描述 | 运算规则 |
& | 与 | 两个位都为1时,结果为1 |
| | 或 | 两个位都为0时,结果为0 |
^ | 异或 | 两个位相同为0,相异为1 |
~ | 取反 | 0变1,1变0 |
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 |
>> | 右移 | 各二进位全部右移若干位,高位补0或符号位补齐 |
位运算可以进行高效运算,可以用在状态压缩DP中
位运算常见的应用
1.在二分算法中,mid=l+r>>1;比mid=(l+r)/2;要快。
2.左移一位相当于乘以2,右移一位相当于余以2。(计算n*(2^m)可以用n<<m,计算n/(2^m)可以用n>>m)
3.(n ^ (n >> 31)) - (n >> 31)可以用于取n的绝对值(n是int类型)
4.可以判断两个非零数符号是否相同(x ^ y)>= 0
5.可以获取一个二进制的某一位 (a >> b) & 1
6.将一个数二进制的某一位设置为0
int unsetBit(int a, int b) { return a & ~(1 << b); }
7.将一个数二进制的某一位设置为1
int setBit(int a, int b) { return a | (1 << b); }
8.将一个数二进制的某一位取反
int flapBit(int a, int b) { return a ^ (1 << b); }
9.判断奇偶
if ((a & 1) == 0)判断是否为偶数