很多初学C语言的同学都会跳过位运算,觉得平时写代码用不到、晦涩难懂、全是二进制看着头疼。
但如果你去看内核源码、嵌入式开发、算法题、高性能代码,会发现一个共同点:大佬极其偏爱位运算。
位运算是计算机最底层的运算,速度最快、开销最小、代码极简。很多看似复杂的判断、状态标记、数值运算,一行位运算就能搞定。
今天这篇文章,我从零带大家彻底吃透 C 语言六大位运算符,看懂大佬代码到底“秀”在哪里。
一、先搞懂:什么是位运算?
计算机所有数据在底层都是 二进制 0、1 存储的。
所有例子我都会用最简单的数字讲解,保证新手一次看懂。
位运算就是直接对数据的二进制每一位进行操作,不需要经过十进制转换,所以:
-
运算速度远超普通加减乘除
-
占用资源极低
-
代码极度精简优雅
C语言提供 6 种位运算符:
-
& 按位与
-
| 按位或
-
^ 按位异或
-
~ 按位取反
-
<< 左移
-
>> 右移
二、逐个拆解:6大位运算符原理+实战案例
1、按位与 & :有0则0,全1才1
规则:两个二进制位同时为1,结果才是1,否则为0。
常见用途:清零、取位、判断奇偶
#include <stdio.h>
int main()
{
// 3: 0011
// 5: 0101
// &:0001 = 1
int a = 3 & 5;
printf("%d\n",a); // 输出1
return 0;
}
经典技巧:判断奇偶
普通写法:
if(n % 2 == 0)
大佬写法:偶数
if((n & 1) == 0)
2、按位或 | :有1则1,全0才0
规则:两个二进制位只要有一个是1,结果就是1。
常见用途:置位、状态标记
#include <stdio.h>
int main()
{
// 3:0011
// 5:0101
// |:0111 = 7
int a = 3 | 5;
printf("%d\n",a); //7
}
常用于:给某个二进制位强制设为1,做状态开关。
3、按位异或 ^ :相同为0,不同为1
规则:两位相同为0,两位不同为1。
大佬最爱运算符,用处超级多!
核心特性:
-
任何数异或自己 = 0
-
任何数异或0 = 本身
-
支持交换律、结合律
经典妙用:不引入中间变量交换两个数
#include <stdio.h>
int main()
{
int a = 10,b = 20;
a = a ^ b;
b = a ^ b;
a = a ^ b;
// 完成交换
}
4、按位取反 ~ :0变1,1变0
规则:对二进制每一位进行反转。
注意:C语言中 int 是补码存储,所以 ~运算结果容易出现负数,面试常考!
#include <stdio.h>
int main()
{
int a = 1;
// 00000001 取反 11111110(补码)
printf("%d\n",~a); // -2
}
5、左移 << :快速乘2
无论是正数还是负数,左移都是对应的二进制位向左移动,高位丢弃,低位补0,左移的时候。
等价于将这个数据乘以2的n次方。
#include <stdio.h>
int main()
{
int a = 2;
a = a << 1; // 左移1位
printf("%d",a); // 4
}
比乘法运算效率高得多,底层源码大量使用。
6、右移 >> :快速除2
逻辑右移(针对无符号数据)
- 对应的是正数和0,逻辑右移是对应的二进制位向右移动,低位丢弃,高位补0.
算术右移(针对有符号数据):
- 若是数据为正数,算术右移是对应的二进制向右移动,低位丢弃,高位补0。
- 若是数据为负数,算术右移是对应的二进制位向右移动,低位丢弃,高位补1。
int a = 8;
a = a >> 1;
printf("%d",a); //4
三、为什么大佬写代码都爱用位运算?(核心精髓)
看完基础,你就能明白:位运算不是炫技,是真的强
1、速度碾压普通算术运算
CPU 原生支持位运算,一个时钟周期就能完成,加减乘除需要多个周期。高性能服务、嵌入式、操作系统内核必须大量用位运算。
2、极致节省内存
普通变量存一个状态要一个 int,位运算可以用一个 int 的二进制每一位存一个状态。
一个int 32位,可以存32个开关状态,极度省内存。
3、代码极度简洁优雅
几十行的判断逻辑,位运算一行搞定。
四、新手最容易踩的坑(面试易错点)
-
位运算优先级 低于 ==、!=,不加括号极易出错
-
~取反是针对补码,不要当成简单的相反数
-
负数右移是补符号位,不是补0
-
不要混淆逻辑与&& 和 按位与
五、总结
位运算看似冷门,实则是区分初级程序员和进阶程序员的分水岭。
如果你想读懂内核源码、刷算法、做嵌入式、应对面试,位运算必须吃透。
它不是花里胡哨的语法,是计算机最底层、最高效、最优雅的运算逻辑。
后续我会继续更新位运算高阶玩法:状态机、掩码、算法真题、内核源码经典位运算技巧,感兴趣可以关注收藏!
210

被折叠的 条评论
为什么被折叠?



