前言
包括逻辑运算符和位移运算符
按位逻辑运算符作用于整数类型和char类型,并且只针对一个位而不是整个的数据。
取反运算符‘~’
unsigned char a = 2;//00000010
所以~ a位=为11111101
和乘法类似,不改变原来数据的值,但是会产生一个新值。
按位与‘&’
(1101) & (0111) = (0101)
对每一个位都取一个反,结果就是每一位的结果
还有一个缩写的形式,a &= (0111)
按位或‘|’
和上面的都差不多,也有缩写
按位异或‘^’
这个其实和上面都一样,但是异或可能并不是很常见
真值表:
0 0 0
1 0 1
0 1 1
1 1 0
即相同为0,不同为1
用途
1.掩码
首先明白一下与运算的性质,首先只要有一个输入是0,那么结果就是0;如果一个结果是1,那么输出的决定权就在另一个数据上,所以我们可以利用这一性质来隐藏一些位数(0)和显示一些位数(1)。
常用的掩码如oxff或者是0377(二进制编码都是1111 1111),其他的位数都是0。
之前也好奇一个问题,如果两个数据 二进制位数不相同,那么我们相与的结果会是怎么样的呢?
答案是会补全少的那个,当然是用0来补了。所以才有其他位数是0 说法。
2.打开位/设置位
(默认0叫关闭,1为打开)
有时候,我们需要改变一个数据的一特定位来实现某一个功能(比如打开音响需要将一个数据的一号位置为1,别问这个例子怎么回事,反正书上给的),那么就需要或运算符了。
或运算符只要有一个为1,则整体为1;而如果有一个是0,那么输出结果就只看剩下一位了。
所以,如果是打开一号位,我们可以采取或0000 0010的方式来实现(注意最右边的一个是0号位)
3.关闭位/清空位
和上面的例子差不多,不过我们采用的不是或,因为我们想基于上面的输入来实现。
0000 0010来实现关闭一号位,所以我们需要将该输入取反,那么此时就需要与运算了。
所以就是采用与非门的方式,即a &= ~b(b为输入)
4.切换位
在已打开和关闭的位之间进行切换。我们可以采用异或的方式,将该位和1异,即可得到结果。
所以只需要一个掩码即可实现需求。
5.检查位
需要先用与上掩码的方式将剩下的位掩盖,然后再和该掩码相比较。
移位运算符
将数值位进行移动,左移’<<‘和右移’>>’
如0010 << 2 = 1000,数值向右移动两位相当于是乘22,,也就是扩大四倍。
还有简化版:a <<= 2;的形式
如果在扩大或者缩小的过程中位数不够怎么办?
左移是直接舍弃多余的位数,将空出来的圈零顶位;
右移则是将右侧多余的舍弃,将空出来的圈零。