C 语言位运算符精通:与、或、异或、移位、取反全解析
什么是位运算符?
位运算符操作整数值的单个比特位。不同于作用于整数的算术运算符,位运算符作用于二进制表示,适合标志位、掩码、底层设备控制等性能关键任务。
C 语言提供以下位运算符:
| 运算符 | 含义 |
|---|---|
| & | 按位与 |
| | | 按位或 |
| ^ | 按位异或 |
| ~ | 按位非(一补数) |
| << | 左移 |
| >> | 右移 |
位运算符仅定义于整型;不适用于 float、double 等浮点类型。
运算从最低有效位(LSB)向最高有效位(MSB)进行。下表汇总二元运算真值表:
| 操作数 x | 操作数 y | x & y | x | y | x ^ y |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
以下逐一深入各运算符并附示例。
按位与(&)
仅当两对应位均为 1 时结果为 1,否则 0。常用于掩码屏蔽不需要的位。
Op1 = 0000 1101 Op2 = 0001 1001 Result = 0000 1001
按位或(|)
只要对应位有一个为 1 结果即为 1。常用于设置特定位。
Op1 = 0000 1101 Op2 = 0001 1001 Result = 0001 1101
按位异或(^)
对应位不同时结果为 1。适合翻转特定位。
Op1 = 0000 1101 Op2 = 0001 1001 Result = 0001 0100
示例程序:
#include <stdio.h>
int main() {
int a = 20; /* 20 = 010100 */
int b = 21; /* 21 = 010101 */
int c = 0;
c = a & b; /* 20 = 010100 */
printf("AND - c = %d\n", c);
c = a | b; /* 21 = 010101 */
printf("OR - c = %d\n", c);
c = a ^ b; /* 1 = 000001 */
printf("XOR - c = %d\n", c);
return 0;
}
输出:
AND - c = 20 OR - c = 21 XOR - c = 1
移位运算符(<< 和 >>)
移位运算符按指定位数左/右移动比特位。
operand << n– 左移,右侧补 0operand >> n– 右移,左侧补 0
以 4 位数 1111 为例:
x << 2 → 1100 x >> 2 → 0011
程序演示:
#include <stdio.h>
int main() {
int a = 20; /* 20 = 010100 */
int c = 0;
c = a << 2; /* 80 = 101000 */
printf("Left shift - c = %d\n", c);
c = a >> 2; /* 5 = 000101 */
printf("Right shift - c = %d\n", c);
return 0;
}
输出:
Left shift - c = 80 Right shift - c = 5
按位取反(~)
取反运算符翻转每一位:1 变 0,0 变 1。是作用于单操作数的一元运算符。
0000 1111 → 1111 0000
示例程序:
#include <stdio.h>
int main() {
int a = 10; /* 10 = 001010 */
int c = ~a; /* 补码表示为 -11 */
printf("Complement - c = %d\n", c);
return 0;
}
输出:
Complement - c = -11
所有运算符综合演示
下面简洁程序演示所有位运算符:
#include <stdio.h>
int main() {
unsigned int x = 48; /* 0011 0000 */
unsigned int y = 13; /* 0000 1101 */
int z = 0;
z = x & y; /* 0 = 0000 0000 */
printf("AND - x & y = %d\n", z);
z = x | y; /* 61 = 0011 1101 */
printf("OR - x | y = %d\n", z);
z = x ^ y; /* 61 = 0011 1101 */
printf("XOR - x ^ y = %d\n", z);
z = ~x; /* -49 = 1111 0100 (补码) */
printf("NOT - ~x = %d\n", z);
z = x << 2; /* 192 = 1100 0000 */
printf("Left shift - x << 2 = %d\n", z);
z = x >> 2; /* 12 = 0000 1100 */
printf("Right shift - x >> 2 = %d\n", z);
return 0;
}
结果:
AND - x & y = 0 OR - x | y = 61 XOR - x ^ y = 61 NOT - ~x = -49 Left shift - x << 2 = 192 Right shift - x >> 2 = 12
核心要点
- 位运算符仅适用于整型,作用于二进制位级
- 包含逻辑(与、或、异或)、移位(左/右)、取反(~)操作
- 标志操作、底层 I/O、性能关键代码中不可或缺
C语言