C语言位运算详解:6种运算符原理与实战代码
C语言提供了六种位运算符用于直接操作二进制比特。本文详细讲解按位与(&)、或(|)、异或(^)、取反(~)以及左移(<<)和右移(>>)的原理,并通过具体的整型数值转换过程和编译运行结果,说明其在掩码处理、位状态切换及算术替代中的核心用途。
位运算基础概念
位运算是直接对存储单元中的二进制比特(Bit)进行操作的技术。计算机中8个比特构成一个字节,这是最小可操作的数据单元。C语言支持的位运算不仅限于纯二进制字面量,其操作数可以是十进制、八进制或十六进制整数,编译器在运行时会将它们统一转换为内存中的二进制补码形式进行计算。
C语言包含以下六种位运算符:
&:按位与 (Bitwise AND)|:按位或 (Bitwise OR)^:按位异或 (Bitwise XOR)~:按反 (Bitwise NOT)<<:左移 (Left Shift)>>:右移 (Right Shift)
第1步:掌握按位与运算 (&)
目的:用于对指定位清零,或提取特定低位数据。
规则:只有两个参与运算的对应比特位都为 1 时,结果才为 1,否则为 0。
正数示例:9 & 5 的过程如下:
0000 0000 0000 0000 0000 0000 0000 1001 (9)
& 0000 0000 0000 0000 0000 0000 0000 0101 (5)
-----------------------------------------
0000 0000 0000 0000 0000 0000 0000 0001 (1)
负数涉及内存中的补码存储。例如 -9 & 5 的结果为 5。核心应用是掩码操作,如使用 n & 0XFFFF 保留低16位并清空高16位。
#include <stdio.h>
int main(){
int n = 0X8FA6002D;
// 分别输出 9&5, -9&5, 以及高16位清零后的n
printf("%d, %d, %X\n", 9 & 5, -9 & 5, n & 0XFFFF);
return 0;
}
运行结果:1, 5, 2D
第2步:使用按位或运算 (|)
目的:将指定位置为1,同时保持其他位不变。
规则:只要两个对应比特位中有一个为 1,结果即为 1。
示例 9 | 5:
0000 ... 1001 (9)
| 0000 ... 0101 (5)
-------------------
0000 ... 1101 (13)
对于负数 -9 | 5,由于-9的高位均为1,结果仍为 -9。典型应用是将高16位置1:n | 0XFFFF0000。
#include <stdio.h>
int main(){
int n = 0X2D;
// 分别输出 9|5, -9|5, 以及高16位置一后的n
printf("%d, %d, %X\n", 9 | 5, -9 | 5, n | 0XFFFF0000);
return 0;
}
运行结果:13, -9, FFFF002D
第3步:运用按位异或运算 (^)
目的:使特定位反转(0变1,1变0)。
规则:两个对应比特位不同时结果为 1,相同时结果为 0。
注意:原文示例文本中存在符号错误(将 ^ 误写为 |),根据运算符语义修正如下:
示例 9 ^ 5:
0000 ... 1001
^ 0000 ... 0101
----------------
0000 ... 1100 (12)
关于负数的异或:-9 ^ 5 的计算结果为 -14(注:原文示例结果描述有误,此处按运算逻辑核对)。利用该特性可将 n 的高16位反转:n ^ 0XFFFF0000。
#include <stdio.h>
int main(){
unsigned n = 0X0A07002D;
// 验证 9^5=-14 及高位反转结果
printf("%d, %d, %X\n", 9 ^ 5, -9 ^ 5, n ^ 0XFFFF0000);
return 0;
}
运行结果:12, -14, F5F8002D
第4步:执行单目取反运算 (~)
目的:翻转所有比特位。
规则:二进制位 1 变 0,0 变 1。这等效于对该数加1后取负(即 $x = -(y+1)$)。
示例:
~9:将 ...001001 翻转为 ...110110,对应十进制为 -10。
~-9:将 ...110111 翻转为 ...001000,对应十进制为 8。
#include <stdio.h>
int main(){
printf("%d, %d\n", ~9, ~-9 );
return 0;
}
运行结果:-10, 8
第5步:配置移位运算 (<< 和 >>)
左移 (< <<)
将所有位向左移动指定位数,高位丢弃,低位补 0。
例子:9 << 3 相当于乘以 $2^3$ (8),结果为 72。
例子:(-9) << 3 结果为 -72。
右移 (>>)
将所有位向右移动,低位丢弃。高位填充规则取决于符号:
无符号数或正数:高位补 0(逻辑右移)。
负数:高位补 1(算术右移),以维持负号。
例子:9 >> 3 相当于除以 $2^3$,结果向下取整为 1。
例子:(-9) >> 3 结果为 -2。
#include <stdio.h>
int main(){
printf("%d, %d\n", 9<<3, (-9)<<3 );
return 0;
}
左移测试运行结果:72, -72
右移测试运行结果:1, -2
以上就是C语言位运算的详细内容,更多关于C语言底层编程的技巧资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









