2011-05-20 66 views
38

我有一個標誌位的問題。 我有一個int變量來保存標誌。首先,我爲該變量設置了一些標誌。稍後我需要檢查在該變量中設置了多少個標誌。但我不知道這樣做。檢查標誌位java

回答

65

要檢查,看是否有位值設置:

int value = VALUE_TO_CHECK | OTHER_VALUE_TO_CHECK; 

if ((value & VALUE_TO_CHECK) == VALUE_TO_CHECK) 
{ 
    // do something--it was set 
} 

if ((value & OTHER_VALUE_TO_CHECK) == OTHER_VALUE_TO_CHECK) 
{ 
    // also set (if it gets in here, then it was defined in 
    // value, but it does not guarantee that it was set with 
    // OR without other values. To guarantee it's only this 
    // value just use == without bitwise logic) 
} 

需要注意的是,你不應該有一個檢查值0,除非它代表全或無(不要使用位邏輯是很重要的以進行比較;僅使用value == 0),因爲任何value & 0總是爲0.

+0

這裏我沒有標誌(如VALUE_TO_CHECK)。我有另一個包含一些標誌的變量。所以我需要找到A包含所有的女巫是否存在於B中。 – Nagaraju 2011-05-20 04:27:35

+2

@Naga raju所以請澄清你的問題。 – EJP 2011-05-20 04:35:31

+1

如果你有一堆標誌設置的值:'int A = flag1 | flag3 | flag15;'你想看看它是否具有來自'B'的所有值:'int B = flag3 |在上面的代碼中,flag15;',then'B'_is_' VALUE_TO_CHECK':'if(A&B == B)'(忽略可怕的變量名)。另外,由於聽起來像你對此感到困惑,你應該參考垃圾回答併購買參考書(由Josh Bloch提供)。這是作爲Java開發人員擁有的最好的書。 – pickypg 2011-05-20 04:37:31

30

另外,考慮使用EnumSet而不是位字段。另見Bloch, Item 32

附錄:作爲一個具體的example

枚舉集還提供了豐富的,類型安全的替代傳統的位標誌:

EnumSet.of(Style.BOLD, Style.ITALIC); 

請特別注意從AbstractSet繼承了方便的方法和AbstractCollection

+0

如何使用它來替換位域?我沒能跳起來。 – Suragch 2017-02-11 09:20:24

+0

我不確定您遇到問題的位置;更多示例可以在[這裏]找到(http://stackoverflow.com/search?tab=votes&q=%5bjava%5d%20EnumSet%20bit%20field)。 – trashgod 2017-02-11 10:18:52

14

如果你想檢查是否有a所有標誌位b集,您可以檢查它爲:

(a & b) == b 
7

我使用了以下內容:

public class BitFlags 
{ 
    public static boolean isFlagSet(byte value, byte flags) 
    { 
     return (flags & value) == value; 
    } 

    public static byte setFlag(byte value, byte flags) 
    { 
     return (byte) (flags | value); 
    } 

    public static byte unsetFlag(byte value, byte flags) 
    { 
     return (byte) (flags & ~value); 
    } 
} 

但是,如果不需要它「低級別」,建議使用EnumSets來代替額外的安全類型。