位运算
1. &:按位与
- 规律:
- 一假则假
- 任何位上的数和1相&得到的结果还是那个数
2. |:按位或
- 规律:
- 一真则真
3. ^:按位异或
- 规律:
- 不同为1,相同为0
- 异或的结果和参与运算的顺序没有关系
- 相同的两个数异或等于0
- 任何一个数异或上0,结果不变
- 任何一个数异或上同一个数两次,结果不变
4. ~:按位取反
5. <<:左移(左移后,溢出位去掉,后面补0。)
- 规律:
- 左移就是用左移的数乘以2的移动次幂
例如:
9 << 1 == 9 * 2(1) == 18
9 << 2 == 9 * 2(2) == 9 * 4 == 36
注意点:由于左移运算,被移动的数最高位会被抛弃,所以左移有可能会改变一个数的正负形
6. >>:右移(右移后,溢出位去掉,前面补上符号位,符号位是什么就补什么。)
- 规律:
- 右移就是用右移的数除以2的移动次幂
例如:
9 >> 1 == 9 / 2(1) == 4
9 >> 2 == 9 / 2(2) == 9 / 4 == 2
注意:负数的左移右移是补码在移动,因为负数都是以补码的形式存储在内存中的
7. 应用场景
如果想让某一个数乘以或者除以2的n次幂,最高效的运算方法就是左移右移n位。
8. 用位运算实现两个数的交换
int a = 5;
int b = 10;
- 中间量方式
int temp = a;
a = b;
b = temp;
- 无中间量
a = a + b;//a = 15
b = a - b;//b = 15 - b = 原来a的值
a = a - b;//a = 15 - b(原来a的值) = 原来b的值
- 位移
a = a ^ b;
b = a ^ b;//b = (a ^ b) ^ b = a
a = a ^ b;//a = a ^ (a ^ b) = b
网友评论