C语言学习笔记(8):位运算符、++、– 运算符的用法
一、位运算符(Bitwise Operators)
C语言提供了6个位运算符,用于直接操作整数的二进制位(bit)。常用于底层编程、嵌入式、性能优化等场景。
| 运算符 | 名称 | 用法示例 | 说明 | 二进制示例(假设 a=5 (0101), b=3 (0011)) |
|---|---|---|---|---|
& | 按位与 | a & b | 对应位都为1才为1,否则为0 | 0101 & 0011 = 0001(1) |
| | 按位或 | a | b | 对应位有一个为1即为1 | 0101 | 0011 = 0111(7) |
^ | 按位异或 | a ^ b | 对应位不同为1,相同为0 | 0101 ^ 0011 = 0110(6) |
~ | 按位取反 | ~a | 所有位翻转(0变1,1变0) | ~0101 = 1010(补码表示-6) |
<< | 左移 | a << n | 所有位向左移动n位,低位补0 | 0101 << 1 = 1010(10) |
>> | 右移 | a >> n | 所有位向右移动n位(有符号数高位补符号位,无符号补0) | 0101 >> 1 = 0010(2) |
实用技巧示例:
- 判断奇偶数(比 %2 更快)
if (num & 1) printf("奇数"); else printf("偶数");
- 交换两个数(不用临时变量)
a ^= b;
b ^= a;
a ^= b;
- 清除最低位的1(常用于位操作题)
num = num & (num - 1); // 例如 0100 & 0011 = 0000
- 获取最低位的1
lowest_bit = num & -num; // 补码技巧
- 快速乘2 / 除2
x = x << 1; // x *= 2
x = x >> 1; // x /= 2(无符号数或正数)
二、++ 和 — 运算符(自增自减)
| 运算符 | 名称 | 用法示例 | 说明 | 执行顺序与返回值 |
|---|---|---|---|---|
++ | 自增 | ++i 或 i++ | 将变量值加1 | 前置++:先加后用,返回加后的值 后置++:先用后加,返回原值 |
-- | 自减 | --i 或 i-- | 将变量值减1 | 同上 |
关键区别:前置 vs 后置
int a = 5;
int b = ++a; // 前置:a先加1变成6,然后b=6
printf("a=%d, b=%d\n", a, b); // 输出 a=6, b=6
int c = 5;
int d = c++; // 后置:先把c的原值5赋给d,然后c再加1
printf("c=%d, d=%d\n", c, d); // 输出 c=6, d=5
常见陷阱(容易出错的代码)
int i = 1;
printf("%d\n", i++ + ++i); // 未定义行为!不同编译器结果不同(禁止这样写)
int j = 1;
j = j++; // 未定义行为!结果不确定
正确使用建议:
- 单独一行使用时,前置后置无区别(如
i++;或++i;都行)。 - 表达式中混用时,尽量避免,容易造成未定义行为(Undefined Behavior)。
- 推荐风格:单独一行写
i++,表达式中用++i(更明确)。
循环中的经典用法
for (int i = 0; i < 10; i++) { // i++ 等价于 i = i + 1
printf("%d ", i);
}
// 输出 0 1 2 ... 9
三、总结对比
| 运算符类型 | 运算符 | 优先级 | 结合性 | 常见用途 |
|---|---|---|---|---|
| 位运算 | ~ | 高 | 右 | 取反、位掩码 |
| << >> | 次高 | 左 | 移位、快速乘除 | |
| & | 中 | 左 | 取特定位、清除位 | |
| ^ | 中 | 左 | 异或交换、校验 | |
| | | 低 | 左 | 设置位 | |
| 自增自减 | ++ — | 最高 | 右 | 计数器、循环控制 |
学习建议:
- 位运算多练习二进制转换,理解每位操作。
- 自增自减记住“前置先加后用,后置先用后加”,避免在复杂表达式中混用。
- 实际项目中位运算常用于驱动开发、加密、算法优化;++– 则是日常最常用。
掌握这两部分,你对C语言的底层控制能力会大幅提升!下一节可以继续学习条件运算符和逗号运算符。