位运算

基础知识

异或运算技巧:

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

原码反码补码

notion imagenotion image
notion imagenotion image

三个常用技巧

1. lowbit

提取 x 的最后一位 1 ,例如 x = 10100, lowbit(x) = 100
通过 x&(-x) 实现 x&(-x) = x&(~x+1)
notion imagenotion image

2. 查看二进制中右数第k位的值

(n >> k) & 1

3. 消除数字n的二进制表示的最后一个 1

通过 n &(n-1)实现
notion imagenotion image

经典题目

经典套路:异或之后取 lowbit,然后分两组,得到两个值即为答案
1310
201
169
268
191
231
342
89 格雷编码

速通