在C ++中按位和

时间:2011-12-13 07:02:24

标签: c++ bitwise-operators

我已经定义了这样的枚举:

enum blStatus {
   Class1 = 0x40,           /* 0000,0100,0000 */
   Class2 = 0x80,           /* 0000,1000,0000 */
   Class3 = 0x100,          /* 0001,0000,0000 */
   Class4 = 0x200           /* 0010,0000,0000 */
}

现在,我在代码的某处:

 if ( status &= Class1 )
   ++c1;
 else if ( status &= Class2 )
   ++c2;
 else if ( status &= Class3 )
   ++c3;
 else if ( status &= Class4 )
   ++c4;

假设,状态为此值:

 status = 143   /* 0000,1000,1111 */

在调试时,没有任何条件成立。但是“status& = Class2”是:

 0000,1000,1111 & 0000,1000,0000 = 0000,1000,0000

并且c2计数器必须递增。但在调试时,所有条件都被传递(忽略)并且没有计数器增量。为什么呢?

4 个答案:

答案 0 :(得分:7)

使用&而不是& =。

当您执行x& = y时,您将获得:

 x = x & y;

您真正想要的代码:

if ( status & Class1 )

现在,在每个if子句之后,保持状态值不变。

答案 1 :(得分:4)

这是因为您要更改status

if ( status &= Class1 )

status &= Class1status = status & Class1相同,因此状态更改为0

status = 0000 1000 1111
Class1 = 0000 0100 0000  &
-----------------------
status = 0000 0000 0000

由于您打算只检查不需要进行分配的位:

if ( status & Class1 )

答案 2 :(得分:1)

因为if ( status &= Class1 )会将0分配给状态,所以在所有下一个条件中,状态值将为0,因此不执行任何条件,并且不会增加conter的值。

答案 3 :(得分:0)

运算符&=将计算结果放入左操作数(等于a = a & b)。 计算后,表达式(status &= Class1) status变量为0,所有以下条件均为FALSE