2011-12-13 12 views
2

我已經定義了一個枚舉這樣的:位與在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 */ 

調試時,沒有任何條件是真實的。然而 「狀態& =等級2」 是:

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

和C2計數器必須遞增。但在調試時,所有條件都被傳遞(忽略)並且沒有計數器增量。爲什麼?

回答

7

使用&而不是& =。

當你做X & = Y給你:

x = x & y; 

你真的想在你的代碼是什麼:現在

if (status & Class1) 

,每個if語句後,你離開的價值地位不變。

4

這是因爲你改變了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) 
1

因爲if (status &= Class1)會將0賦予狀態,因此在所有下一個條件中狀態值將爲0,因此不會執行任何條件,並且conter的非增量。

0

運算符&=將計算結果放入左操作數(等於a = a & b)。 在計算表達式(status &= Class1)之後,status變量爲0並且所有下列條件爲FALSE