c++中的位与

bitwise AND in C++

本文关键字:位与 c++      更新时间:2023-10-16

我定义了一个像这样的enum:

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计数器必须加1。但在调试时,所有条件都被传递(忽略),计数器不会增加。为什么?

使用&而不是&=。

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

 x = x & y;

你真正想要的代码:

if ( status & Class1 )

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

这是因为您在

中更改了status
if ( status &= Class1 )

status &= Class1status = status & Class1相同,结果状态变为0:

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

因为你只想检查位,所以不需要赋值:

if ( status & Class1 )

因为if ( status &= Class1 )将给status赋值为0,所以在接下来的所有条件中,status的值将为0,因此没有任何条件将被执行,也没有任何参数被增加。

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