位运算
基础知识
异或运算技巧:
- A^B = B^A
- A^(B^C) = (A^B)^C
- A^0 = A
- A^A = 0
- 快速判断两个值是否相同 A^A==0?
- 某一位翻转(任意数位和1异或均可取),例如翻转0010的第二位,可以将0010与1<<1进行按位异或运算
- 使用异或来判断二进制中1的数量是奇数还是偶数: 求 11000110中1的个数是奇数还是偶数? 1^1^0^0^0^1^1^0 = 0 结果为1就是奇数,结果为0就是偶数
- 不占用额外空间进行交换两个数: a = a^b b = a^b a = a^b 注意第二行的 a 此时已经是 a=a^b 了
- 将二进制中最右边的1置为0:
a&(a-1)
,其他位不变
- 提取二进制最右边的1,且将其他位置为0:
a&(-a)
原码反码补码


三个常用技巧
1. lowbit
提取 x 的最后一位 1 ,例如
x = 10100, lowbit(x) = 100
通过 x&(-x) 实现
x&(-x) = x&(~x+1)

2. 查看二进制中右数第k位的值
(n >> k) & 1
3. 消除数字n的二进制表示的最后一个 1
通过
n &(n-1)
实现
经典题目
经典套路:异或之后取 lowbit,然后分两组,得到两个值即为答案
1310
201
169
268
191
231
342
89 格雷编码
速通
位运算经典套路:异或之后取 lowbit, 然后分两组,得到两个值即为答案