本文最后更新于:3 个月前

最近复习C语言学到位运算,发现这个特性很灵活,绝不仅仅是简单的与或非语法而已,为加深印象还是决定记录下。位运算的不同运算符结合场景是具有一定含义的,本文分别介绍了按位与或非的基本语法,以及各自的使用场景。

按位与(&)

语法简记:有0得0,全1得1

使用场景:

  • “屏蔽”信息位,具体来说包含两层:
    • 取特定位:当一个二进制位与0进行“与”时,就可以将其置0,从而屏蔽该信息。
    • 取特定位:当一个二进制位与1进行“与”时,就可以“取”出该数。

综合两部分,可以用按位与运算符取出一个二进制串的特定位信息,并屏蔽特定位信息。屏蔽信息位值得单独强调,它有时可以实现掩饰(mask)的效果,比如10011011 & 00000111 = 00000011,这有可能强调之后要操作二进制序列的最后三位(即保留这三位的信息),因此实现通过&将前5位掩饰(mask)起来

或(|)

语法简记:有1得1,全0得0

使用场景:

  • 置位:当一个二进制位与1进行“与”时,就可以将其置1。置位操作和常见,以前写C51时也常用,为I/O提供一个初始电平。

按位非(~)

这个比较特殊,按位非是一个单目运算,也因此很简单。

语法简记:有1得0,有0得1

使用场景:

  • 一时只想到切换单片机的I/O口电气状态了,比如控制流水灯的亮灭等。

按位异或(^)

这个运算符很强大,以前总觉得异或很奇怪,后来才知道大有用处。

语法简记:相同为1,不同为0

语法的理解:判断两个位是否为“异”,如果是,则取1,否则取0。即不同为1,相同为0

异或运算的性质

  • 异或满足交换律和结合律
  • x ^ x == 0
  • x ^ 0 == x
  • x ^ 1 == ~x

异或运算的性质带来的更多有趣的应用场景:

  • 所有位置零:与自身异或

  • 使特定位翻转(相当于实现了~的功能,但比~更灵活):与1异或

  • 使特定位保留原值:与0异或

  • 交换两个值,不用临时变量:

    a = a^b;
    b = a^b;
    a = a^b;
    • 优点:不用临时变量
    • 缺点:速度没有使用临时变量快、当a、b引用的是一个同一个对象时,会使该变量为0。

Reference

[1] 《C语言程序设计(第四版)谭浩强著》