2013-06-01 102 views
2

我試圖檢查的標誌值的標誌可以是一個有點|'D一起。到目前爲止,我使用這個檢查位標誌

if ((someclass.flags | CONST_SOMEFLAG) == someclass.flags) 

檢查,如果其真的還是假的,但有沒有這樣做的更加「優雅」的方式?

回答

0

這將正常工作,但它更傳統的使用&:

if (flags & MASK) . . . 

這可能是因爲在某些處理器測試寄存器爲!= 0的速度比測試與存儲值相等的速度要快。

+0

如果'sizeof(flags)> sizeof(long)',這可能不起作用,例如一個32位編譯的64位字。原因是按位數學計算的結果將被評估爲'int',其將截斷高階位並因此評估爲'假'。 –

+0

請參閱c99規範,6.3.1.8p2。如果二元運算符的兩個操作數是兩個不同的整數大小,那麼較小的一個以保留值的方式提升到較大的大小。 –

+0

不幸的是,有大量的c89編譯器不符合。 –

2

用位或設置標誌,使用按位與測試,如:

if (someclass.flags & CONST_SOMEFLAG) ...

+2

注意,如果給出了'SOMEFLAG'一個以上的位,這將如果任何位被設置返回TRUE;,而OP代碼將在所有設置檢查。 – Potatoswatter

0

你想知道的是,如果該標誌位被置在所有其它可能設置或未置位。該規範的方式做到這一點,是按位與(&)測試是非零

if(someclass.flags & CONST_SOMEFLAG) 
+1

OP是正確的。它會檢查設置標誌是否會使(總)值保持不變。 – Potatoswatter

+1

他原來的代碼會正常工作,這只是非常規的。如果將一個掩碼與一個值進行或運算不會改變該值,那麼將設​​置掩碼位(並且其他位不會被打擾或測試)。 –

+0

@Patatoswatter:是的,你說得對。我刪除了錯誤的陳述。 – datenwolf