[英]Flags - Check if bits are set and only those bits are set
根據有關堆棧溢出的其他問題,我們可以使用以下方法檢查是否設置了位標志:
if(value & flag)
但是,我想檢查是否設置了特定的標志,以及是否僅設置了構成這些標志的位。
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.