BitSet和从整数/长整数

如果我有一个整数,我想执行位操作,我怎么能加载到一个java.util.BitSet ? 我怎样才能把它转换回int或long? 我不太关心BitSet的大小 – 它将始终是32或64位长。 我只想使用set()clear()nextSetBit()nextClearBit()方法而不是按位运算符,但我找不到一个简单的方法来初始化一个数字types的位集。

下面的代码从一个长整型值创build一个位集,反之亦然:

 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:原因,你是对的

添加到finnw答案:还有BitSet.valueOf(long[])BitSet.toLongArray() 。 所以:

 int n = 12345; BitSet bs = BitSet.valueOf(new long[]{n}); long l = bs.toLongArray()[0]; 

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

如果您遇到Java 6或更早版本的问题,可以使用BigInteger如果它不可能是性能瓶颈) – 它具有getLowestSetBitsetBitclearBit方法(最后两个将创build一个新的BigInteger而不是就地修改)。

为了从一个小的 BitSet以一种“stream畅”的方式获得long回报:

 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); 

注意:使用BitSet::valueOfBitSet::toLongArray当然更容易。

nextSetBit的文档非常直接

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

不是public void set(int bit)方法是什么你要找的?

Interesting Posts