2010-03-18 20 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当然更容易。