C/Cpp中的位运算符
参考:C++.Primer.Plus(第6版)中文版].(美)普拉达 P856
按位运算符
& 与 (电路里的串联) 1&1=1 其他都是0 1&0=0 0&1=0 0&0=0 | 或 (电路里的并联) 0|0=0 其他都是1 1|0=1 0|1=1 1|1=1 ~ 非 取反 ~1 = 0 ; ~0 = 1
常用的按位运算符技术
控制硬件时,常涉及打开/关闭特定的位或查看它们的状态。按位运算符提供了执行这种操作的途径。
下面简要地介绍一下这些方法,在下面的示例中,lottabits表示一个值,bit表示特定位的值。位从右到左进行编号,从0开始,因此,第n位的值为2^n。例如,只有第3位为1的整数的值为2^3。一般来说,各个位都对应于2的幂。因此我们使用术语位(bit)表示2的幂;这对应于特定位为1,其他所有位都为0的情况。
1.打开位
下面两项操作打开 lottabits 中对应于 bit 表示的位:
lottabits = lottabits | bit;
lottabits |= bit;
他们都将对应的位设置为1,不管这一位以前是多少。因为 0 OR 1 = 1; 1 OR 1 = 1。即 x OR 1 = 1
2.切换位
下面两项操作切换 lottabits中对应于bit表示的位。也就是说,如果位是关闭的,则将被打开;如果位是打开的,将被关闭:
lottabits = lottabits ^ bit;
lottabits ^= bit;
对0和1执行XOR操作的结果为1,因此将关闭已打开的位;对1和1执行XOR操作的结果为0,因此将打开已关闭的位。
lottabits中其他所有位都保持不变,这是因为对0和0执行XOR操作的结果为0,对1和0执行XOR操作的结果为1。即 x 与 0 异或 得到 它本身 x。
3.关闭位
下面的操作将关闭 lottabits 中对应于 bit 表示的位:
lottabits = lottabits & ~bit;
lottabits &= ~bit;
该语句关闭相应的位,而不管它以前的状态如何。
首先,运算符 ~bit 将原来为1的位设置为0,原来为0的位设置为1。对0和任意值执行AND操作都将得到0,因此关闭相应的位。
lottabits中其他所有位都保持不变,这是因为对1和任意值执行AND操作时,该位的值将保持不变。
4.测试位的值
如果要确定 lottabits中对应于bit的位是否为1,则下面的测试不一定管用:
if (lottabits == bit)
这是因为即使 lottabits中对应的位为1,而其他位也可能为1。仅当对应的位为1,而其他位皆为0时,上述等式才为tue。
因此修补的方式是,首先对 lottabits和bit执行AND操作,这样生成的值的对应位保持不变,因为对1和任何值执行AND操作都将保持该值不变;而其他位都为0,因为对0和任何值执行AND操作的结果都为0。
正确的测试如下
if (lottabits & bit == bit) // testing a bit //或者简化为 if (lottabits & bit) //testing a bit
常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。
昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。