千家信息网

C语言位运算符如何使用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"C语言位运算符如何使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、位运算符分析
千家信息网最后更新 2026年11月03日C语言位运算符如何使用

本篇内容介绍了"C语言位运算符如何使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、位运算符分析

C语言中的位运算符

位运算符直接对 bit 位进行操作,其效率最高。

&按位与
|按位或
^按位异或
~取反
<<左移
>>右移

左移和右移注意点

左操作数必须为整数类型

  • char 和 short 被隐式转换为 int 后进行移位操作

右操作数的范围必须为:[0,31]

左移运算符<< 将运算数的二进制位左移

  • 规则:高位丢弃,低位补0

右移运算符>> 把运算数的二进制位右移

  • 规则︰高位补符号位,低位丢弃

下面一段代码:

#include int main(){    printf("%d\n", 3 << 2);     printf("%d\n", 3 >> 1);     printf("%d\n", -1 >> 1);     printf("%d\n", 0x01 << 2 + 3);    printf("%d\n", 3 << -1); // oops!    return 0;}

下面为输出结果:

注意四则运算优先级大于位运算,所以 0x01 << 2 + 3 的结果是 32。 还有就是右操作数的范围必须为:[0,31],如果不在这个范围内,程序的输出结果由不同类型的编译器所决定,结果将不确定,就像本代码 3 << -1 一样。

二、小贴士

防错准则:

  • 避免位运算符,逻辑运算符和数学运算符同时出现在一个表达式中

  • 当位运算符,逻辑运算符和数学运算符需要同时参与运算时,尽量使用括号 ( ) 来表达计算次序

小技巧:

  • 左移 n 位相当于乘以 2 的 n 次方,但效率比数学运算符高

  • 右移 n 位相当于除以 2 的 n 次方,但效率比数学运算符高

下面看一段交换两个整型变量值的代码:

#include  #define SWAP1(a,b)  \{                   \    int t = a;      \    a = b;          \    b = t;          \}     #define SWAP2(a,b)  \{                   \    a = a + b;      \    b = a - b;      \    a = a - b;      \}      #define SWAP3(a,b)  \{                   \    a = a ^ b;      \    b = a ^ b;      \    a = a ^ b;      \}    int main()   {    int a = 1;    int b = 2;        //printf("a = %d\n", a);    //printf("b = %d\n", b);        SWAP1(a,b);        printf("a = %d\n", a);    printf("b = %d\n\n", b);        a = 1;    b = 2;        SWAP2(a,b);        printf("a = %d\n", a);    printf("b = %d\n\n", b);        a = 1;    b = 2;    SWAP3(a,b);        printf("a = %d\n", a);    printf("b = %d\n\n", b);           return 0;}

第一种方法需要引入第三方变量,第二种方法可能会导致越界问题,第三种的方法效率较高,且不用引入第三方变量。

注意第三种方法:执行 a = a ^ b; 后,b = a ^ b; 就相当于 b = a ^ b ^ b; 先计算后面的,就是 b = a ^ 0,结果就是 b = a;再执行a = a ^ b;相当于 a = a ^ b ^ b,即 a = a ^ b ^ a,显然结果是 b。

小知识:

A 异或 0 等于 A ,A 异或 1 等于 非A。

三、位运算与逻辑运算

位运算与逻辑运算不同:

  • 位运算没有短路规则,每个操作数都参与运算

  • 位运算的结果为整数,而不是 0 或 1

  • 位运算优先级高于逻辑运算优先级

下面再来看一个混淆改变的判断条件:

#include int main(){    int i = 0;    int j = 0;    int k = 0;    if( ++i | ++j & ++k )    {        printf("Run here...\n");    }    printf("i = %d, j = %d, k = %d\n\n", i, j, k);    i = 0;    j = 0;    k = 0;     if( ++i || ++j && ++k )    {        printf("Run here...\n");    }    printf("i = %d, j = %d, k = %d\n\n", i, j, k);    return 0;}

下面为输出结果:

可以看到,如果错把++i || ++j && ++k 写成++i | ++j & ++k,虽然都能运行,但是其中的执行细节不一样,在实际工程中可能会出现 bug,而且还不好排查。

"C语言位运算符如何使用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

运算 运算符 结果 逻辑 操作数 效率 方法 输出 语言 代码 优先级 就是 知识 范围 规则 不同 二进制 低位 内容 变量 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技园 北京路客互联网科技有限公司 圆梦互联网科技 互联网科技有限公司图片 中国互联网科技发展 迪茉互联网科技 互联网科技论文 汇久创客互联网科技 北京禾田雨橡互联网科技 互联网金融和金融科技 互联网科技公司招聘 深圳市运趣互联网科技有限公司 北京华百购互联网科技有限公司 为客找房互联网科技公司怎么样 山东子淼互联网科技有限公司 黑科技 体验场景 互联网大会 广州千川互联网科技有限公司 江苏互联网科技小贷 扫呗互联网科技有限公司 青岛易易互联网科技 广州百单互联网科技有限公司 广州互联网科技公司 美国互联网黑科技 互联网公司会议桌创意科技软装饰 广州慧亚互联网科技怎么样 上海创道互联网络科技有限公司 湖北辰鑫科技互联网 互联网科技对化妆品行业 网互联网络科技 武汉亿视互联网科技有限公司
0