2011-10-19 66 views
12

是否有一種方法通常用於檢查int/other數據類型中是否存在標誌?我想出了這樣的事情:按位檢查是否存在標誌

if ((host&flagtocheckfor)==flagtocheckfor) 

它工作正常 - 但是這是一種常用的方法來設置標誌是這種方式標誌通常是檢查?還是有更簡潔的方法?

+2

你不需要== flagtocheck的一部分。 &的結果是0(位已關閉)或非0(位已打開),並且在C中至少已經對應於False和True。 – librik

+1

@librik,這對單位掩碼是可以的,但有些可能是多位的。看到我的答案。 – paxdiablo

回答

23

這很好完全是在支持它們的大多數語言中檢查位標誌的方式。

例如:

#define BIT_7 0x80 
#define BITS_0_AND_1 0x03 

if ((flag & BIT_7) == BIT_7) ... 
if ((flag & BITS_0_AND_1) == BITS_0_AND_1) ... 

雖然你可以檢查東西,如先用:

if ((flag & BIT_7) != 0) ... 

不會實際上是第二個工作,因爲它會返回true,如果要麼的該位被設置,而不是

對於完整性,C允許你設置位掩碼:

flag = flag | BIT_7; // or you can also use 'flag |= BIT_7' 

你可以這樣清除它們:

flag = flag & (~BIT_7); 

和撥動他們:

flag = flag^BIT_7; 
+0

啊哈 - 謝謝你,我不確定。 – ultifinitus