2017-10-21 313 views
0

據堆棧溢出等問題,我們可以檢查,如果一個位標誌使用設置:標誌 - 檢查位設置,只有那些位設置

if(value & flag) 

Check if flag is set in integer variable

Checking for bit flags

C/C++ check if one bit is set in, i.e. int variable

但是,我想檢查是否設置了特定的標誌,如果只有構成那些f滯後。

static const uint64_t SOMEFLAG_0 = 0x0; 
static const uint64_t SOMEFLAG_1 = 0x1 << 0; 
static const uint64_t SOMEFLAG_2 = 0x1 << 1; 
static const uint64_t SOMEFLAG_3 = 0x1 << 2; 
static const uint64_t SOMEFLAG_4 = 0x1 << 3; 

我的嘗試是:

if ((value & ~(SOMEFLAG_1 | SOMEFLAG_4)) == 0) 

然而,這不會在標誌1設置和標誌4未設置的情況下工作。我想測試它們是否都被設置,並且沒有設置其他位。

如何以常規方式執行該測試? 也許我想XOR的價值和麪具,做一些事情?

+0

'value == required_flags'? – navyblue

回答

3

有時候,最簡單的答案在你把思想包裹在複雜的事情之後就沒有了。

這是不夠的:

if(value == flag) 

如果你需要檢查多個標誌:

if(value == (SOMEFLAG_1 | SOMEFLAG_4)) 
      ^     ^
      important    important 

而且不要忘了在括號括起來的位操作。優先級是意想不到的,沒有它們,value == SOMEFLAG_1將首先被評估。


而且我想這是說教用於啓用(和注意)編譯器警告一個完美的時間:

鐺有一個非常有用的包含在-Wall一個-Wparentheses

5::5:28:warning:|優先級低於==; ==將 評估第一[-Wparentheses]

if(value == SOMEFLAG_1 | SOMEFLAG_4) 
    ~~~~~~~~~~~~~~~~~~~~^ 

5:5:28:注:圍繞 '==' 表達 地方括號沉默此警告

if(value == SOMEFLAG_1 | SOMEFLAG_4) 
        ^
    (    ) 

5: :5:28:注意:在|處放置括號表達 評估它首先

if(value == SOMEFLAG_1 | SOMEFLAG_4) 
        ^
      (     ) 

GCC有也:

5:5:14:警告:在 操作數建議各地比較括號 '|' [-Wparentheses]

if(value == SOMEFLAG_1 | SOMEFLAG_4) 
    ~~~~~~^~~~~~~~~~~~~ 
0

你幾乎有它。它是:

if ((value & (SOMEFLAG_1 | SOMEFLAG_4)) == (SOMEFLAG_1 | SOMEFLAG_4)) 

當然這假設你不在乎什麼SOMEFLAG2或3。如果這也是這種情況(你關心所有位),那麼:

if (value == (SOMEFLAG_1 | SOMEFLAG_4))