Подтвердить что ты не робот

BitSet с целым числом и длительностью

Если у меня есть целое число, на которое я хотел бы выполнить обработку бит, как я могу загрузить его в java.util.BitSet? Как я могу преобразовать его обратно в int или long? Меня не волнует размер BitSet - он всегда будет 32 или 64 бит. Я просто хотел бы использовать методы set(), clear(), nextSetBit() и nextClearBit(), а не побитовые операторы, но я не могу найти простой способ инициализировать бит, установленный с помощью числового типа.

4b9b3361

Ответ 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), что вы ищете?