目录
- 1.基础位运算
- [2. 给一个数n,确定它的二进制表示中的第x位是0还是1](#2. 给一个数n,确定它的二进制表示中的第x位是0还是1)
- 3.将一个数n的二进制表示的第x位修改成1
- 4.将一个数n的二进制表示的第x位修改成0、
- [5. 位图的思想](#5. 位图的思想)
- 6.提取一个数(n)二进制表示中最右侧的1
- 7.干掉一个数(n)二进制表示中最右侧的1
- 8.位运算的优先级
- 9.异或(^运算的运算律)
1.基础位运算
java
0 1 0
0 1 1
-----
&:有0就是0 0 1 0
|:有1就是1 0 1 1
^:相同为0,相异为1 /无进位相加 0 0 1
2. 给一个数n,确定它的二进制表示中的第x位是0还是1
java
n: 0 1 1 0 1 0 1 0 0 1
结论:(n >> x) & 1
3.将一个数n的二进制表示的第x位修改成1
java
0 1 1 0 1 0 1 0 0 1
| 0 0 0 0 0 1 0 0 0 0
-> 0 1 1 0 1 1 1 0 0 1
结论:n |= (1 << x)
4.将一个数n的二进制表示的第x位修改成0、
java
0 1 1 0 1 0 1 0 0 1
& 1 1 1 1 0 1 1 1 1 1
-> 0 1 1 0 0 1 1 0 0 1
结论:n &= (~(1 << x))
5. 位图的思想
本质:哈希表
6.提取一个数(n)二进制表示中最右侧的1
java
0 1 1 0 1 0 1 0 0 0
~ 1 0 0 1 0 1 0 1 1 1
+1 1 0 0 1 0 1 1 0 0 0
& 0 1 1 0 1 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
结论:n & -n
-n:本质就是将最右侧的1,左边的区域全部变成相反
7.干掉一个数(n)二进制表示中最右侧的1
java
0 1 1 0 1 0 1 0 0
& 0 1 1 0 1 0 0 1 1
0 1 1 0 1 0 0 0 0
结论:n & (n - 1)
(n - 1):将最右侧的1,右边的区域(包括1)全部变成相反
8.位运算的优先级
能加括号就加括号,最不容易出错!
9.异或(^运算的运算律)
1.a ^ 0 = a
2. a ^ a = 0
3. a ^ b ^ c = a ^ (b ^ c)