Bitset de e para inteiro/longo
-
20-09-2019 - |
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.
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?