如果我有一个我想对其执行位操作的整数,我如何将它加载到一个java.util.BitSet
?如何将其转换回 int 或 long?我不太关心它的大小BitSet
——它总是 32 或 64 位长。我只想使用set()
、clear()
、nextSetBit()
和nextClearBit()
方法而不是按位运算符,但我找不到一种简单的方法来初始化具有数字类型的位集。
问问题
67415 次
6 回答
65
以下代码从 long 值创建一个位集,反之亦然:
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:当然,你是对的
于 2010-03-18T22:15:56.873 回答
47
添加到 finnw 答案:还有BitSet.valueOf(long[])
和BitSet.toLongArray()
。所以:
int n = 12345;
BitSet bs = BitSet.valueOf(new long[]{n});
long l = bs.toLongArray()[0];
于 2014-03-25T18:17:32.110 回答
20
Java 7 具有BitSet.valueOf(byte[])
和BitSet.toByteArray()
如果您坚持使用 Java 6 或更早版本,BigInteger
如果它不太可能成为性能瓶颈,则可以使用它 - 它有getLowestSetBit
,setBit
和clearBit
方法(最后两个将创建一个新BigInteger
的而不是就地修改。)
于 2011-02-02T14:42:51.800 回答
3
以“流畅”的long
方式从小人物 那里获得回报:BitSet
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
andBitSet::toLongArray
当然更容易。
于 2016-07-04T13:17:33.660 回答
1
几乎直接来自 nextSetBit 的文档
value=0;
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
value += (1 << i)
}
于 2014-07-14T22:36:15.890 回答
-3
方法不是public void set(int bit)
您要找的吗?
于 2010-03-18T22:09:22.247 回答