c语言学习笔记(8)位运算符,++,–运算符的用法

C语言学习笔记(8):位运算符、++、– 运算符的用法

一、位运算符(Bitwise Operators)

C语言提供了6个位运算符,用于直接操作整数的二进制位(bit)。常用于底层编程、嵌入式、性能优化等场景。

运算符名称用法示例说明二进制示例(假设 a=5 (0101), b=3 (0011))
&按位与a & b对应位都为1才为1,否则为00101 & 0011 = 0001(1)
|按位或a | b对应位有一个为1即为10101 | 0011 = 0111(7)
^按位异或a ^ b对应位不同为1,相同为00101 ^ 0011 = 0110(6)
~按位取反~a所有位翻转(0变1,1变0)~0101 = 1010(补码表示-6)
<<左移a << n所有位向左移动n位,低位补00101 << 1 = 1010(10)
>>右移a >> n所有位向右移动n位(有符号数高位补符号位,无符号补0)0101 >> 1 = 0010(2)

实用技巧示例

  1. 判断奇偶数(比 %2 更快)
   if (num & 1) printf("奇数"); else printf("偶数");
  1. 交换两个数(不用临时变量)
   a ^= b;
   b ^= a;
   a ^= b;
  1. 清除最低位的1(常用于位操作题)
   num = num & (num - 1);  // 例如 0100 & 0011 = 0000
  1. 获取最低位的1
   lowest_bit = num & -num;  // 补码技巧
  1. 快速乘2 / 除2
   x = x << 1;  // x *= 2
   x = x >> 1;  // x /= 2(无符号数或正数)

二、++ 和 — 运算符(自增自减)

运算符名称用法示例说明执行顺序与返回值
++自增++ii++将变量值加1前置++:先加后用,返回加后的值
后置++:先用后加,返回原值
--自减--ii--将变量值减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语言的底层控制能力会大幅提升!下一节可以继续学习条件运算符和逗号运算符。

文章已创建 3707

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部