本文最后更新于: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语言程序设计(第四版)谭浩强著》
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!