[英]bitwise AND in C++
我已經定義了這樣的枚舉:
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計數器必須遞增。 但在調試時,所有條件都被傳遞(忽略)並且沒有計數器增量。 為什么?
使用&而不是&=。
當你做x&= y時,你得到:
x = x & y;
您真正想要的代碼:
if ( status & Class1 )
現在,在每個if子句之后,您保持狀態值不變。
這是因為您要更改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 )
會將0分配給狀態,所以在所有下一個條件中,status的值將為0,這樣就不會執行任何條件,並且不會增加conter的值。
運算符&=
將計算結果放入左操作數(等於a = a & b
)。 在計算表達式(status &= Class1)
, status
變量為0
並且所有以下條件都為FALSE
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.