Si j’ai un nombre entier sur lequel je voudrais effectuer une manipulation de bits, comment puis-je le charger dans un java.util.BitSet
? Comment puis-je le reconvertir en int ou long? Je ne suis pas tellement préoccupé par la taille de BitSet
– il sera toujours 32 ou 64 bits de long. Je voudrais juste utiliser les méthodes set()
, clear()
, nextSetBit()
et nextClearBit()
plutôt que des opérateurs nextClearBit()
, mais je ne trouve pas de moyen facile d’initialiser un bit défini avec un type numérique.
Le code suivant crée un bit défini à partir d’une valeur longue et 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; } }
EDITED: Maintenant les deux directions, @leftbrain: de cause, vous avez raison
Ajouter à finnw answer: il y a aussi BitSet.valueOf(long[])
et BitSet.toLongArray()
. Alors:
int n = 12345; BitSet bs = BitSet.valueOf(new long[]{n}); long l = bs.toLongArray()[0];
Java 7 a BitSet.valueOf(byte[])
et BitSet.toByteArray()
Si vous êtes bloqué avec Java 6 ou une version antérieure, vous pouvez utiliser BigInteger
s’il ne s’agit pas d’un goulot d’étranglement des performances – il a les getLowestSetBit
, setBit
et clearBit
(les deux dernières créeront un nouveau BigInteger
au lieu de modifier sur place).
Pour obtenir un long
retour sur un petit BitSet
d’une manière «fluide» :
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: L'utilisation de BitSet::valueOf
et de BitSet::toLongArray
est bien sûr plus facile.
Assez directement de la documentation de nextSetBit
value=0; for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i+1)) { value += (1 << i) }
La méthode du public void set(int bit)
n’est-elle pas ce que vous recherchez?