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

 


 

posted @ 2022-10-14 16:46  htj10  阅读(170)  评论(0编辑  收藏  举报
TOP