c++中的位与
bitwise AND in C++
我定义了一个像这样的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 &= Class1
与status = 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
。
相关文章:
- 所有可能的链接生成器与64位密钥
- OpenCV矩阵奇怪的加法,乘法与浮点数和8位值
- 24 位地址和 24 位算术与 24 位地址与 16 位地址算术之间的区别?
- 完美的广场与位明智和
- 位移位与前导 1.
- 与位字段的并集为位字段成员提供了意外值
- 是否与赢得64位有关?错误:STATUS_ACCESS_VIOLATION
- 如何将32位字符与内联assembelyc++中的32位字符进行比较
- 与 32 位共享对象的链接问题
- 在早期的 C 和 C++ 编译器中,手动位移位与乘法和除法的相关性如何?
- EDSDK 3.6 macOS - 32 位与 64 位和链接错误
- 将 64 位整数中的每个其他位与 32 位整数进行比较
- 下一个最大的整数,有一些中间位与模式匹配?
- C++32位与64位浮动限制
- 32 位与 64 位:巨大的运行时差异
- std::cout 可以设置坏位或故障位与操作员<<吗?如果是,什么时候?
- c++中的位与
- 如何对两个大整数进行位与运算
- g++32位与64位汇编中的动态与静态链接差异
- C++:32位与64位流操作