在C++中按位和

mah*_*ood 2 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 */
}
Run Code Online (Sandbox Code Playgroud)

现在,在我的代码中的某个地方:

 if ( status &= Class1 )
   ++c1;
 else if ( status &= Class2 )
   ++c2;
 else if ( status &= Class3 )
   ++c3;
 else if ( status &= Class4 )
   ++c4;
Run Code Online (Sandbox Code Playgroud)

假设,状态为此值:

 status = 143   /* 0000,1000,1111 */
Run Code Online (Sandbox Code Playgroud)

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

 0000,1000,1111 & 0000,1000,0000 = 0000,1000,0000
Run Code Online (Sandbox Code Playgroud)

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

nsa*_*ers 7

使用&而不是&=.

当你做x&= y时,你得到:

 x = x & y;
Run Code Online (Sandbox Code Playgroud)

您真正想要的代码:

if ( status & Class1 )
Run Code Online (Sandbox Code Playgroud)

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