位运算

概述

位运算是一种高效率的运算工具

位运算是一种对二进制数进行操作的运算符,他的优先级仅次于

位运算包括,按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、按位左移(<<)、按位右移(>>)

按位与(&)

按位与是上下比较两个都为1结果是1,有0结果为0;

例如:

1
2
3
4
5
6
int a = 5;  // 00000000 00000000 00000000 00000101
int b = -2; // 11111111 11111111 11111111 11111110
// 00000000 00000000 00000000 00000101
// 11111111 11111111 11111111 11111110
//结果:
// 00000000 00000000 00000000 00000100 = 4

按位或(|)

与按位与刚好相反,按位与是上下比较两个都为0结果是0,有1结果为1.

1
2
3
4
5
6
7
8
int a = 5;  // 00000000 00000000 00000000 00000101
int b = -2; // 11111111 11111111 11111111 11111110
// 00000000 00000000 00000000 00000101
// 11111111 11111111 11111111 11111110
//结果:
// 11111111 11111111 11111111 11111111 补码
// 11111111 11111111 11111111 11111110 反码,补码-1
// 10000000 00000000 00000000 00000001 源码,反码按位取反 = -1

按位异或(^)

上下比较相同为0,不同为1.

1
2
3
4
5
6
7
8
int a = 5;  // 00000000 00000000 00000000 00000101
int b = -2; // 11111111 11111111 11111111 11111110
// 00000000 00000000 00000000 00000101
// 11111111 11111111 11111111 11111110
//结果:
// 11111111 11111111 11111111 11111011 补码
// 11111111 11111111 11111111 11111010 反码,补码-1
// 10000000 00000000 00000000 00000101 源码,反码按位取反 = -5

按位取反(~)

0变1,1变0

1
2
3
4
5
6
int a = 5;
// 00000000 00000000 00000000 00000101
//结果:
// 11111111 11111111 11111111 11111010 补码
// 11111111 11111111 11111111 11111001 反码,补码-1
// 10000000 00000000 00000000 00000110 源码,反码按位取反 = -6

按位左移(<<)

向左移一位,左边丢弃,右边补零

1
2
3
4
5
6
7
8
9
10
int a = 5;
// 00000000 00000000 00000000 00000101
//结果:
// 00000000 00000000 00000000 00001010 = 10
int b = -2;
// 11111111 11111111 11111111 11111110
//结果:
// 11111111 11111111 11111111 11111100 补码
// 11111111 11111111 11111111 11111011 反码,补码-1
// 10000000 00000000 00000000 00000100 源码,反码按位取反 = -4

按位右移(>>)

向右移一位,右边丢弃,右边补原符号位

1
2
3
4
5
6
7
8
9
10
int a = 5;
// 00000000 00000000 00000000 00000101
//结果:
// 00000000 00000000 00000000 00000010 = 2
int b = -2;
// 11111111 11111111 11111111 11111110
//结果:
// 11111111 11111111 11111111 11111100 补码
// 11111111 11111111 11111111 11111011 反码,补码-1
// 10000000 00000000 00000000 00000100 源码,反码按位取反 = -4