C语言中的位运算符包括以下几种:
- 按位与(&) :对应位都为1时结果为1,否则为0。例如:
int a = 6; // 二进制为 0000 0110
int b = 3; // 二进制为 0000 0011
int result = a & b; // 结果为 0000 0010 (十进制2)
```
2. **按位或(|)** :两个位中有一个为1时结果为1,否则为0<b class="card40_249__sup_a7f6" data-sup="sup">1</b>。例如<b class="card40_249__sup_a7f6" data-sup="sup">2</b>:
```c
int a = 11; // 二进制为 1011
int b = 12; // 二进制为 1100
int result = a | b; // 结果为 1111 (十进制15)
```
3. **按位异或(^)** :两个位不同时结果为1,相同时为0<b class="card40_249__sup_a7f6" data-sup="sup">1</b>。例如<b class="card40_249__sup_a7f6" data-sup="sup">2</b>:
```c
int a = 11; // 二进制为 1011
int b = 12; // 二进制为 1100
int result = a ^ b; // 结果为 0001 (十进制1)
```
4. **按位取反(~)** :将0变为1,将1变为0<b class="card40_249__sup_a7f6" data-sup="sup">3</b>。例如<b class="card40_249__sup_a7f6" data-sup="sup">2</b>:
```c
int a = 5; // 二进制为 0101
int result = ~a; // 结果为 1010 (十进制-6)
```
5. **右移(>)** :将二进制位向右移动指定的位数,左边空出的位用0或1填充,正数补0,负数补1。例如<b class="card40_249__sup_a7f6" data-sup="sup">2</b>:
```c
int a = 8; // 二进制为 1000
int result = a >> 1; // 结果为 0100 (十进制4)
```
位运算符的优点包括高效、节省空间和应用广泛。它们直接作用于二进制数据,执行速度非常快,并且可以使用单个位来代表数据的状态。位运算符在网络编程、加密算法、数据压缩等方面有广泛应用<b class="card40_249__sup_a7f6" data-sup="sup">1</b>。
### 实战演练<b class="card40_249__sup_a7f6" data-sup="sup">4</b>
1. **判断奇偶数** <b class="card40_249__sup_a7f6" data-sup="sup">5</b>:
```c
int num = 9;
if (num & 1) {
printf("%d是奇数\n", num);
} else {
printf("%d是偶数\n", num);
}
```
2. **数据加密** :
```c
int a = 10;
int b = 20;
a ^= b; // a现在是a和b的异或结果
b ^= a; // b现在变成了a原来的值
a ^= b; // a现在变成了b原来的值
printf("a = %d, b = %d\n", a, b);
```
3. **快速清零和保留指定位** <b class="card40_249__sup_a7f6" data-sup="sup">5</b>:
```c
int a = 15;
a &= 7; // a的二进制为 0111, 结果为 0111 (十进制7)
```
通过这些示例,你可以看到位运算符在C语言中的强大功能和广泛应用。掌握位运算可以显著提高代码的执行效率和简洁性。