C语言按位操作符
在C语言中,按位操作符直接对整数的二进制位(bit)进行操作,常用于底层编程、硬件控制或性能优化场景。以下是按位操作符的详细说明和用法:
1. 按位操作符列表
| 操作符 | 名称 | 功能描述 | 示例 | ||
|---|---|---|---|---|---|
| & | 按位与 | 对应位均为1时结果为1,否则为0 | a & b | ||
| ` | ` | 按位或 | 对应位至少一个为1时结果为1 | `a | b` | 
| ^ | 按位异或 | 对应位不同时结果为1,相同时为0 | a ^ b | ||
| ~ | 按位取反 | 所有位取反(0变1,1变0) | ~a | ||
| << | 左移 | 所有位向左移动,低位补0 | a << n | ||
| >> | 右移 | 所有位向右移动,高位补符号位或0 | a >> n | 
2. 按位操作符详解
(1) 按位与(&)
 
-  功能:逐位比较两个操作数,只有当对应位均为1时,结果的该位为1。 
-  示例: int a = 5; // 二进制: 0101 int b = 3; // 二进制: 0011 int c = a & b; // 结果: 0001 (十进制1) printf("%d\n", c); // 输出: 1
-  典型用途: -  掩码操作(提取某些位)。 
-  判断奇偶( a & 1结果为1则是奇数,0则是偶数)。
 
-  
(2) 按位或(|)
 
-  功能:逐位比较两个操作数,只要对应位有一个为1,结果的该位为1。 
-  示例: int a = 5; // 0101 int b = 3; // 0011 int c = a | b; // 0111 (十进制7) printf("%d\n", c); // 输出: 7
-  典型用途: -  设置某些位为1(如权限控制)。 
 
-  
(3) 按位异或(^)
 
-  功能:逐位比较两个操作数,对应位不同时结果为1,相同时为0。 
-  示例: int a = 5; // 0101 int b = 3; // 0011 int c = a ^ b; // 0110 (十进制6) printf("%d\n", c); // 输出: 6
-  特性: -  任何数异或自己结果为0( a ^ a = 0)。
-  异或0等于原数( a ^ 0 = a)。
 
-  
-  典型用途: -  交换两个变量的值(无需临时变量): a = a ^ b; b = a ^ b; a = a ^ b;
-  数据加密/简单校验。 
 
-  
(4) 按位取反(~)
 
-  功能:对操作数的所有位取反(0变1,1变0)。 
-  示例: int a = 5; // 二进制: 0000 0101 int b = ~a; // 取反: 1111 1010 (补码表示,实际值为-6) printf("%d\n", b); // 输出: -6
-  注意: -  结果取决于变量的类型(如 unsigned int和int的结果可能不同)。
 
-  
(5) 左移(<<)
 
-  功能:将操作数的所有位向左移动指定位数,低位补0。 
-  示例: int a = 3; // 二进制: 0011 int b = a << 2; // 左移2位: 1100 (十进制12) printf("%d\n", b); // 输出: 12
-  特性: -  左移1位相当于乘以2( a << n≈a * 2^n)。
 
-  
-  用途: -  快速计算2的幂次。 
 
-  
(6) 右移(>>)
 
-  功能:将操作数的所有位向右移动指定位数,高位补符号位(算术右移)或0(逻辑右移)。 
-  示例: int a = 16; // 二进制: 0001 0000 int b = a >> 2; // 右移2位: 0000 0100 (十进制4) printf("%d\n", b); // 输出: 4
-  特性: -  右移1位相当于除以2( a >> n≈a / 2^n)。
 
-  
-  注意: -  对有符号数,右移行为依赖编译器(通常补符号位)。 
 
-  
3. 常见应用场景
-  掩码操作(提取/设置特定位) // 提取低4位 int mask = 0x0F; // 0000 1111 int value = 0x5A; // 0101 1010 int low_bits = value & mask; // 0000 1010 (0xA)
-  快速乘除2的幂次 int a = 10; int double_a = a << 1; // 20 int half_a = a >> 1; // 5
-  交换变量(无临时变量) int x = 10, y = 20; x = x ^ y; y = x ^ y; x = x ^ y;
-  权限控制(用位表示开关) #define READ 0x1 // 0001 #define WRITE 0x2 // 0010 #define EXEC 0x4 // 0100int permissions = READ | WRITE; // 0011 (可读可写) if (permissions & READ) { ... } // 检查读权限
4. 注意事项
-  区分逻辑操作符( &&、||)和按位操作符(&、|)-  逻辑操作符返回 0或1,按位操作符返回整数。
-  示例: int a = 2, b = 3; printf("%d\n", a & b); // 按位与: 2 (二进制 10 & 11 = 10) printf("%d\n", a && b); // 逻辑与: 1 (因为a和b均非零)
 
-  
-  移位操作的未定义行为 -  如果右移负数或左移超过位数,结果可能未定义(编译器依赖)。 
 
-  
-  无符号数右移补0 -  对 unsigned int,右移高位补0;对signed int,通常补符号位。
 
-  
5. 总结
| 操作符 | 用途 | 示例 | ||
|---|---|---|---|---|
| & | 掩码、判断奇偶 | a & 0x01 | ||
| ` | ` | 设置特定位 | `flags | READ` | 
| ^ | 交换变量、简单加密 | a ^ b | ||
| ~ | 位取反 | ~a | ||
| << | 快速乘以2的幂次 | a << 3 | ||
| >> | 快速除以2的幂次 | a >> 2 | 
按位操作符是C语言底层编程的核心工具,合理使用可以提升代码效率和灵活性。
