簡體   English   中英

標志-檢查是否設置了位並且僅設置了那些位

[英]Flags - Check if bits are set and only those bits are set

根據有關堆棧溢出的其他問題,我們可以使用以下方法檢查是否設置了位標志:

if(value & flag)

檢查標志是否在整數變量中設置

檢查位標志

C / C ++檢查是否設置了一位,即int變量

但是,我想檢查是否設置了特定的標志,以及是否僅設置了構成這些標志的位。

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,然后執行某些操作?

有時,最簡單的答案會在您將思想包裹在復雜的事物中之后使您難以理解。

這就夠了:

if(value == flag)

並且如果您需要檢查多個標志:

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

並且不要忘記將按位運算括在括號中。 優先級是意外的,沒有它們, value == SOMEFLAG_1將首先被評估。


我想這是宣講啟用(並注意)編譯器警告的最佳時機:

clang有一個非常有用的-Wparentheses ,它包含在-Wall

5::5:28:警告:| 優先級低於==; ==將首先計算[-括號]

 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:警告:建議在'|'操作數比較中加括號 [-希望]

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

差不多了 它的:

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

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

if (value == (SOMEFLAG_1 | SOMEFLAG_4))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM