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
如果它不可能是性能瓶颈) – 它具有getLowestSetBit
, setBit
和clearBit
方法(最后两个将创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::valueOf
和BitSet::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)
方法是什么你要找的?