Pergunta

Se eu tiver um número inteiro em que gostaria de realizar manipulação de bits, como posso carregá -lo em um java.util.BitSet? Como posso convertê -lo de volta para um int ou longo? Não estou tão preocupado com o tamanho do BitSet - Sempre terá 32 ou 64 bits de comprimento. Eu só gostaria de usar o set(), clear(), nextSetBit(), e nextClearBit() Métodos em vez de operadores bit newwise, mas não consigo encontrar uma maneira fácil de inicializar um pouco com um tipo numérico.

Foi útil?

Solução

O código a seguir cria um pouco de um valor longo e vice -versa:

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

Editado: agora as duas direções, @leftbrain: de causa, você está certo

Outras dicas

Adicione ao Finnw Resposta: Há também BitSet.valueOf(long[]) e BitSet.toLongArray(). Então:

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

Java 7 tem Bitset.ValueOf (byte []) e Bitset.tobytearray ()

Se você está preso ao Java 6 ou anterior, pode usar BigInteger Se não é provável que seja um gargalo de desempenho - ele tem getLowestSetBit, setBit e clearBit Métodos (os dois últimos criarão um novo BigInteger em vez de modificar no local.)

Para obter um long de volta de um pequena BitSet em um 'streamy' caminho:

long l = bitSet.stream()
        .takeWhile(i -> i < Long.SIZE)
        .mapToLong(i -> 1L << i)
        .reduce(0, (a, b) -> a | b);

Vice-versa:

BitSet bitSet = IntStream.range(0, Long.SIZE - 1)
        .filter(i -> 0 != (l & 1L << i))
        .collect(BitSet::new, BitSet::set, BitSet::or);

NB: Usando BitSet::valueOf e BitSet::toLongArray É claro que é mais fácil.

Praticamente direto da documentação do NextSetBit

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

Não é o public void set(int bit) Método o que você está procurando?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top