2010-11-16 28 views
7

我正在嘗試在我的項目中瞭解更多關於此的信息。位標誌的簡單布爾運算符

我目前已經得到這個基本上是:

unsigned char flags = 0; //8 bits 

flags |= 0x2; //apply random flag 

if(flags & 0x2) { 
    printf("Opt 2 set"); 
} 

現在我希望做一些更復雜的事情,我所想要做的是運用三個標誌是這樣的:

flags = (0x1 | 0x2 | 0x4); 

然後從中刪除標誌0x10x2?我想我可以做這樣的事情將位NOT(和位與應用它):

flags &= ~(0x1 | 0x2); 

顯然,他們仍然有什麼或者當我檢查的方式。

我也不知道如何檢查它們是否不存在於位標誌(所以我不能檢查我以前的代碼是否工作),它會是這樣的?

if(flags & ~0x2) 
    printf("flag 2 not set"); 

我找不到適用於此的最近搜索的任何資源,我願意學習這個教別人,我真的很感興趣。如果這很混亂或簡單,我很抱歉。

回答

21

並從中刪除兩個?我想 我可以做這樣的事情:

flags &= ~(0x1 | 0x2); 

刪除這兩個標誌,但 顯然他們留在那裏或 東西無論哪種方式。

這是刪除標誌的正確方法。如果您在該行後輸入printf("%d\n", flags),則輸出應爲4

我也不知道如何檢查 他們不位標記存在(這樣 我不能檢查,如果我以前的代碼 作品),它會像 呢?

if(flags & ~0x2) 
    printf("flag 2 not set"); 

都能跟得上:

if ((flags & 0x2) == 0) 
    printf("flag 2 not set"); 

編輯:

爲了測試多個標誌的存在:

if ((flags & (0x1 | 0x2)) == (0x1 | 0x2)) 
    printf("flags 1 and 2 are set\n"); 

爲了測試沒有多個標誌的,就像以前一樣比較0:

if ((flags & (0x1 | 0x2)) == 0) 
    printf("flags 1 and 2 are not set (but maybe only one of them is!)\n"); 
+0

我是在第一時間,謝謝! – John 2010-11-16 06:23:05

+0

當然,沒問題。按位運算符很有趣。 :) – cdhowie 2010-11-16 06:23:35

+0

現在我將如何檢查兩個標誌是否設置爲無布爾值?就像'if(flags&(0x1 | 0x2))',但即使我只設置了'0x1',它似乎也能工作。 – John 2010-11-16 06:24:20

11

我不知道爲什麼你認爲清算操作不起作用。

flags &= ~(0x1 | 0x2); 

是正確的方法。檢查操作是否有點集是:

if (!(flags & 0x2)) ... 

一個你:

if (flags & ~0x2) ... 

如果任何其他位設置,這可能是爲什麼你的事情爲真結算操作不起作用。問題不在於清算,而在於檢查。

如果你想檢查組中的所有位設置:

if ((flags & (0x2|0x1)) == 0x2|0x1) ...