2012-01-29 137 views
0

我有一個枚舉,我試圖從一個來自數據庫的長整型值進行初始化。基於長值設置枚舉集

public enum ArticlePermission { 
    NONE(0), 
    CAN_READ(2), 
    CAN_EDIT(4), 
    CAN_DELETE(8), 
    CAN_CREATE(16); 

    private long _value; 

    public ArticlePermission(int val) { 
    this._value = val; 
    } 


    public long getValue() { 
    return this._value; 
    } 


    public EnumSet<ArticlePermission> init(long val) { 
    EnumSet<ArticlePermission> es = EnumSet.of(ArticlePermission.NONE); 

    for(ArticlePermission p : values()) { 
     if(val & p.getValue() != 0) { 
      es.add(p); 
     } 
    } 



     return es; 
    } 

} 

我得到一個編譯錯誤稱&運營商不能長期價值被使用。

我該如何正確地做到這一點呢?

回答

4

或者,如果你真的想要做一個按位比較,你只需要額外的括號:

if((val & getValue()) != 0) { 
    // do something 
    } 
+0

錯誤應該是'運算符&不能應用於long,boolean'的東西。對於'&'''&''而言,優先級大概是相同的(我不能,也不想記住)奇數組合的優先級。閱讀'&&',問題相對比較明顯。 – 2012-01-29 21:55:25

+0

這是因爲運算符的優先級,!=高於按位&,所以你很早!= 0首先評估爲布爾值,然後用val來判斷是否非法 – wmz 2012-01-29 21:56:47

+0

&的優先級高於&&;請參閱http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html – DNA 2012-01-29 21:58:42

1

您是否打算使用&&(邏輯與)而不是&(按位與)?如果條件要使用邏輯AND(& &)。

if(val!=0 && p!=null && p.getValue() != 0) { 
      es.add(p); 
} 

有關按位&你需要使用它是這樣的: -

if((val & p.getValue()) != 0)) { 
       es.add(p); 
} 
+0

@ TomHawtin-tackline - 我認爲你在彙編問題上的陳述是錯誤的。我重新嘗試了我給出的兩個代碼片段,並且它們編譯得很好。我不確定你在哪裏看到編譯問題。你能否詳細說明一下? – CoolBeans 2012-01-29 22:03:32

+0

我需要檢查'!= 0'還是'== 1'?如果我在和比特匹配,它應該是1,否則0不是? – Blankman 2012-01-29 22:09:14

+0

@Blankman - 按位返回1(如果兩個位均爲1),並且返回0(如果任何位爲0)。例如,如果val爲3並且p.getValue()爲5,則按位AND(3&5 = 1)將等於1.這有道理嗎? – CoolBeans 2012-01-29 22:17:24