Если у меня есть целое число, на которое я хотел бы выполнить обработку бит, как я могу загрузить его в java.util.BitSet
? Как я могу преобразовать его обратно в int или long? Меня не волнует размер BitSet
- он всегда будет 32 или 64 бит. Я просто хотел бы использовать методы set()
, clear()
, nextSetBit()
и nextClearBit()
, а не побитовые операторы, но я не могу найти простой способ инициализировать бит, установленный с помощью числового типа.
BitSet с целым числом и длительностью
Ответ 1
Следующий код создает бит из длинного значения и наоборот:
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;
}
}
EDITED: теперь оба направления, @leftbrain: причина, вы правы
Ответ 2
Добавьте к finnw ответ: есть также BitSet.valueOf(long[])
и BitSet.toLongArray()
. Итак:
int n = 12345;
BitSet bs = BitSet.valueOf(new long[]{n});
long l = bs.toLongArray()[0];
Ответ 3
Java 7 имеет BitSet.valueOf(byte[])
и BitSet.toByteArray()
Если вы застряли в Java 6 или более ранних версиях, вы можете использовать BigInteger
, если это вряд ли будет узким местом производительности - оно имеет методы getLowestSetBit
, setBit
и clearBit
(последние два будут создавать новый BigInteger
вместо изменения на месте.)
Ответ 4
Чтобы получить long
назад от small 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);
N.B.: Использование BitSet::valueOf
и BitSet::toLongArray
, конечно, проще.
Ответ 5
Довольно многое из документации nextSetBit
value=0;
for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) {
value += (1 << i)
}
Ответ 6
Не метод public void set(int bit)
, что вы ищете?