Appearance
L3_03 位运算
一、与运算 (&)
1.1 定义
两个位都为 1 时结果为 1,否则为 0。
1.2 真值表
| A | B | A & B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
1.3 示例
cpp
#include <iostream>
using namespace std;
int main() {
int a = 5; // 0101
int b = 3; // 0011
cout << (a & b) << endl; // 0001 = 1
return 0;
}1.4 常用用途
- 检查特定位是否为 1
- 清除特定位
二、或运算 (|)
2.1 定义
两个位中有一个为 1 时结果为 1。
2.2 真值表
| A | B | A | B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
2.3 示例
cpp
#include <iostream>
using namespace std;
int main() {
int a = 5; // 0101
int b = 3; // 0011
cout << (a | b) << endl; // 0111 = 7
return 0;
}2.4 常用用途
- 设置特定位为 1
三、非运算 (~)
3.1 定义
对每一位取反。
3.2 真值表
| A | ~A |
|---|---|
| 0 | 1 |
| 1 | 0 |
3.3 示例
cpp
#include <iostream>
using namespace std;
int main() {
int a = 5; // 0000 0101
cout << (~a) << endl; // 1111 1010(补码表示为 -6)
return 0;
}四、异或运算 (^)
4.1 定义
两个位不同时结果为 1,相同时为 0。
4.2 真值表
| A | B | A ^ B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
4.3 示例
cpp
#include <iostream>
using namespace std;
int main() {
int a = 5; // 0101
int b = 3; // 0011
cout << (a ^ b) << endl; // 0110 = 6
return 0;
}4.4 常用用途
- 交换两个变量(不使用临时变量)
- 翻转特定位
五、左移运算 (<<)
5.1 定义
将所有位向左移动指定位数,右边补 0。
5.2 示例
cpp
#include <iostream>
using namespace std;
int main() {
int a = 5; // 0101
cout << (a << 1) << endl; // 1010 = 10
cout << (a << 2) << endl; // 10100 = 20
return 0;
}5.3 性质
- 左移 n 位相当于乘以 2^n
六、右移运算 (>>)
6.1 定义
将所有位向右移动指定位数。
6.2 示例
cpp
#include <iostream>
using namespace std;
int main() {
int a = 10; // 1010
cout << (a >> 1) << endl; // 0101 = 5
cout << (a >> 2) << endl; // 0010 = 2
return 0;
}6.3 性质
- 右移 n 位相当于除以 2^n(向下取整)
七、位运算应用
7.1 判断奇偶性
cpp
bool isOdd(int num) {
return (num & 1) == 1;
}7.2 交换两个变量
cpp
void swap(int &a, int &b) {
a = a ^ b;
b = a ^ b;
a = a ^ b;
}7.3 计算绝对值
cpp
int abs(int num) {
int mask = num >> 31;
return (num ^ mask) - mask;
}7.4 统计二进制中 1 的个数
cpp
int countOnes(int num) {
int count = 0;
while (num) {
num &= (num - 1);
count++;
}
return count;
}