2010-03-18 77 views
42

如果我有一個整數,我想進行位操作,我怎樣才能將它加載到java.util.BitSet?我怎樣才能將它轉換回int或long?我並不關心BitSet的大小 - 它總是32位或64位長。我只想使用set(),clear(),nextSetBit()nextClearBit()方法而不是按位運算符,但我找不到使用數字類型初始化位集的簡單方法。BitSet來自整數/長整數

+1

就我個人而言,我會說原始位操作是去這裏的路。它並不是那麼複雜,正如你所說,我沒有看到一個簡單的方法來獲得一個int或long到一個BitSet。 – 2010-03-18 22:07:40

回答

47

下面的代碼創建一個位從長值,反之亦然設置:

public class Bits { 

    public static BitSet convert(long value) { 
    BitSet bits = new BitSet(); 
    int index = 0; 
    while (value != 0L) { 
     if (value % 2L != 0) { 
     bits.set(index); 
     } 
     ++index; 
     value = value >>> 1; 
    } 
    return bits; 
    } 

    public static long convert(BitSet bits) { 
    long value = 0L; 
    for (int i = 0; i < bits.length(); ++i) { 
     value += bits.get(i) ? (1L << i) : 0L; 
    } 
    return value; 
    } 
} 

編輯:現在兩個方向,@leftbrain:原因,你是對的

+6

因爲我們要檢查是否設置了0位,所以我認爲行(值%1L!= 0)應該是(值%2L!= 0) – 2010-10-30 14:07:26

+0

'if(value&1!= 0)''%'是模運算符,'它始終爲0,因爲所有數字都可以被1 – ithkuil 2012-02-16 15:22:07

+1

FYI整除,這就創建了一個小端順序的bitset – 2012-09-03 09:03:19

-2

是不是public void set(int bit)方法你在找什麼?

+6

用您提供的索引設置一個位。我想設置整數中設置的每一位。 – ataylor 2010-03-18 22:17:10

17

Java 7中具有BitSet.valueOf(byte[])BitSet.toByteArray()

如果你被卡住的Java 6或更早的版本,你可以使用BigInteger如果它是不太可能是一個性能瓶頸 - 它有getLowestSetBitsetBitclearBit種方法(過去兩年將創建一個新BigInteger,而不是就地修改。)

1

差不多直接從nextSetBit

的文檔
value=0; 
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) { 
value += (1 << i) 
} 
+0

對於大於32或64位的BitSet,這會失敗,在這種情況下,您需要在輸出處處理一個int []或long []。但OP明確不在乎,這麼公平。只是一些小毛病:如果長時間,你應該'1L << i',以防止溢出,並且像'value | = 1L << i'這樣的OR就足夠了。 – charlie 2016-07-04 12:46:11

3

要獲得longBitSet回來'流j'方式:

long l = bitSet.stream() 
     .takeWhile(i -> i < Long.SIZE) 
     .mapToLong(i -> 1L << i) 
     .reduce(0, (a, b) -> a | b); 

反之亦然:

BitSet bitSet = IntStream.range(0, Long.SIZE - 1) 
     .filter(i -> 0 != (l & 1L << i)) 
     .collect(BitSet::new, BitSet::set, BitSet::or); 

N.B .:使用BitSet::valueOfBitSet::toLongArray當然更容易。