位运算
把变量的值转换成二进制位进行运算
按位与 &
按位与 & :只有对应的两个二进制位都为1,结果值才是1,否则是0
c
举例 9 & 5
9的二进制位 1001
5的二进制位 101
1001
0101
----
0001
按位与运算的作用,可以精确的知道每个二进制位,因为1与1才为11
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
按位与 |
按位或 | : 只要有一个二进制位为1,结果值就是1,否则是0
c
9 | 5
1001
0101
----
11011
2
3
4
5
6
2
3
4
5
6
按位异或 ^
按位异或 ^ : 当两个二进制位不相同时,结果是1,否则是0
按位异或有对应的规律
- 相同的数值进行异或,结果肯定是0,比如9^9
- 交换 9^5^6 == 9^6^5
- 任何数值跟0进行异或,结果还是原来的值,9^0 == 9
- a^b^a == a^a^b == 0^b == b
c
1001
0101
----
11001
2
3
4
2
3
4
左移 << : a << n,二进制位往左移n位
c
比如9的二进制位是
0000 0000 0000 0000 0000 0000 0000 1001,
左移1之后,最高位舍弃
0000 0000 0000 0000 0000 0000 0001 0010
10010对应的值是18
9 << 1 == 9 * 2的一次方 == 18
9 << 2 == 9 * 2的二次方 == 36
9 << n == 9 * 2的n次方1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
右移 >> : a >> n,二进制位往右移n位
c
8 >> 1 == 8 / 2的一次方 == 4
8 >> 2 == 8 / 2的二次方 == 2
8 >> n == 8 / 2的n次方1
2
3
2
3
交换值的三种写法
第一种,创造一个临时变量
c
int a = 10;
int b = 5;
int temp= a;
a = b;
b = temp1
2
3
4
5
2
3
4
5
第二种,使用算法
c
a = b - a; //a = -5
b = b - a; //b = 10
a = b + a; //a = 51
2
3
2
3
###第三种,使用位运算,a的二进制位1010,b的二进制位0101
c
a = a ^ b; // a = 1111
b = a ^ b; // b = 1010
a = a ^ b; // a = 01011
2
3
2
3