2013-02-04 41 views

回答

4

您不能直接這樣做,因爲對於long值,可以用作位掩碼的原始數字的最大大小實際上是64位。你可以做的是將位掩碼分成2個或更多的int s或long s,然後手動管理它。

int[] mask = new int[4]; 
final int MAX_SHIFT = 32; 

void set(int b) { 
    mask[b/MAX_SHIFT] |= 1 << (b % MAX_SHIFT); 
} 

boolean isSet(int b) { 
    return (mask[b/MAX_SHIFT] & (1 << (b % MAX_SHIFT))) != 0; 
} 
+0

除非奇蹟出現並優化div和mod進入右移/逐位......並且與上述操作相比,成本將會更高。對於不涉及總線/一致性/緩存未命中的CPU,Div/Mod是最昂貴的操作之一。 – bestsss

4

您只能使用原始類型中的位數創建簡單的位掩碼。

如果你有一個32位(如在普通的Java)int然後1 < < 31是你可以移動最低位的最多。

要使用較大的常量使用int元素數組,並且通過將32除以32(使用32位int)並使用%32(modula)移入所選數組元素來確定使用哪個數組元素。

0

是的,如果你打算能位或任何這些常量在一起或全部,那麼你將需要代表每個固定了一下。當然,如果你使用的是int,你將只有32位,而long只會給你64位。

13

您可以使用BitSet來設置或清除任意數量的位。例如

BitSet bitSet = new BitSet(101); 
bitSet.set(100); 
2

Effective Java Item#32建議使用EnumSet而不是位域。在內部,它使用一個位向量,因此它是有效的,但是,由於每個位都有一個描述性名稱(枚舉常量),因此它變得更加可讀。

相關問題