2013-04-23 104 views
1

我看到一段Java代碼約enum計算枚舉值

public enum Classname { 
    UIViewAutoresizingNone(0), 
    UIViewAutoresizingFlexibleLeftMargin(1 << 0), 
    UIViewAutoresizingFlexibleWidth(1 << 1), 
    UIViewAutoresizingFlexibleRightMargin(1 << 2), 
    UIViewAutoresizingFlexibleTopMargin(1 << 3), 
    UIViewAutoresizingFlexibleHeight(1 << 4), 
    UIViewAutoresizingFlexibleBottomMargin(1 << 5); 

    private int value; 

    // constructor 
    private Classname(int v) { 
     this.value = v; 
    } 

    public int value() { 
     return value; 
    } 
} 

System.out.println(Classname.UIViewAutoresizingFlexibleBottomMargin.value); 

輸出:32

我想結果爲2至5。

的功率一般,如果是

i << j 

什麼是快遞(我< < j)是什麼意思?我和j怎樣影響結果?有人可以指點我一個教程嗎?

+0

相關:http://stackoverflow.com/q/16162290/1065197 – 2013-04-24 00:00:23

+1

它在[tutorial](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html)中有解釋。 – jlordo 2013-04-24 00:00:52

回答

3

<<運算符是Java中的left bit-shift operator。例如。 i是1,位是00000001。位的移位左(j)爲5:00100000其是32比特移位到左邊是由2

另外的功率乘以一個整數值的快速方法,我應該指出,這裏所使用的數據類型是int 32位,而不是8位(爲簡單起見,我顯示了最低8位)。如果你不小心,也可以將位移到最後,並丟掉它們。

0

<<是左移運算符。如果將整數視爲二進制字符串,則會將字符串向左移一位並切斷最左邊的位(即0b000101變爲0b01010)。就基本算術而言,除了溢出之外,這是兩倍的乘法。因此,1 < < 5是0b100000,或2^5,或32

在表達式i<<ji是正在操作的基數,其中j是存在的移位的數量。當i是一個,如在你的例子中,1<<n創建一個二進制字符串,其中第n + 1位被設置,並且沒有其他位被設置。這很有用,因爲您可以將這些字符串添加到一起,並檢查每個單獨的位以查看該特定選項是否處於打開狀態。

0

Java枚舉類是類。他們可以擁有實例變量,但它們是可寫的非常糟糕的形式。構造函數

private Classname(int v) { 
    this.value = v; 
} 

表示Classname實例必須使用int值構造。聲明UIViewAutoresizingNone(0)UIViewAutoresizingNone的值設置爲0,大概是爲了使用外部代碼。

但是,這是一種在Java中工作的有點愚蠢的方式。在C語言中,一個會寫一個類似枚舉爲:

typedef enum { 
    UIViewAutoresizingNone     = 0, 
    UIViewAutoresizingFlexibleLeftMargin = 1 << 0, 
    UIViewAutoresizingFlexibleWidth  = 1 << 1, 
    UIViewAutoresizingFlexibleRightMargin = 1 << 2, 
    UIViewAutoresizingFlexibleTopMargin = 1 << 3, 
    UIViewAutoresizingFlexibleHeight  = 1 << 4, 
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5 
} Classname; 

Java和C之間的區別是,在C枚舉真的ints的心臟。這是完全合法的寫,給出了上述聲明,

Classname windowOptions = UIViewAutoresizingFlexibleLeftMargin | 
          UIViewAutoresizingFlexibleRightMargin; 

這臺windowOptions到1 | 4 == 5,和外部系統將能夠使用&運營商挑選的選擇了。

在Java中,你不能這樣做。相反,你會使用一個EnumSet<Classname>

EnumSet<Classname> windowOptions = 
    EnumSet.of(Classname.UIViewAutoresizingFlexibleLeftMargin, 
       Classname.UIViewAutoresizingFlexibleRightMargin); 

窗口系統將使用Set.contains確定哪個選項已經被設置。要在C世界做什麼,有人會寫:

int bitMask = 0; 
for(Classname option: windowOptions) { 
    bitMask |= option.getValue(); 
} 

坦率地說,這是一團糟。