1. 位运算
<< 左移 0011 << 1 = 0110
>> 右移 0110 >> 1 = 0011
| 按位或 0011 | 1011 = 1011
& 按位与 0011 & 1011 = 0011
~ 取反 ~0011 = 1100
^ 异或 0011 ^ 1011 = 1000
1.1 异或常见特殊操作
- 将x右边的n位清零:x & (~0 << n)
- 获取x的第n位: (x >> n) & 1
- 获取x的第n位的幂值:x & (1 << (n-1))
- 仅将第n位设置成1: x | (1 << n)
- 仅将第n位设置成1: x & (~ (1 << n))
- 将x最高位至第n位设置成0:x & ((1 << n) - 1)
将第n位到第0位设置成0:x & (~((1 << (n + 1)) - 1))
判断奇偶:
x % 2 == 1
等同于 (x & 1) ==1
x % 2 == 0
等同于 (x & 1) ==0
- 取半数
x = x / 2
等同于 x = x >> 1
mid = (left + right) / 2
等同于 mid = (left + right) >> 1
- 去掉最低位的1
x = x & (x - 1)
- 得到最低位到1
1.3 题
- number-of-1-bits
// for loop
// x & (x - 1) 去除最后一个1 可以写成 x &= x - 1
- power-of-two
x != 0 && (x & (x - 1) ) == 0 即可
- reverse-bits
// int —> “010101” ——> reverse string ——> int
// 位移相加
- n-queens
// 位运算替代判重数组
n-queens-ii
counting-bits
//
2. 布隆过滤器 BloomFilter
2.1 基础概念
- 使用一个很长的二进制和一系列随机映射函数(哈希函数)。布隆过滤器可以用于检测一个元素是否在一个集合中。
- 优缺点:
- 优点:空间效率和时间效率都远远超过一般都算法。
- 缺点:有一定的误识别率和删除困难。
- 特点:
- 一个元素会有多个位来标识。
- 检测存在是时候只有有一个二进制位为0就是不存在。
- 如果检测存在的时候所有的二进制位都为1,只能代表可能存在,并不代表一定存在!