57 votes

Exemple de BitSet Java

Je cherche un bon exemple Java BitSet pour travailler avec 0 et 1. J'ai essayé de regarder les Javadocs mais je ne comprends pas l'utilisation de la classe en lisant simplement cela. Par exemple, comment les méthodes and , or et xor fonctionnent-elles sur deux objets différents BitSet ?

Par exemple:

   BitSet bits1 = new BitSet();
  BitSet bits2 = new BitSet();

  bits2.set(1000001);
  bits1.set(1111111);

  bits2.and(bits1);

  System.out.println(bits2);
 

Si je le fais, il renvoie bits2 comme vide, pourquoi?

106voto

Louis Wasserman Points 67557

Pour le problème spécifique que vous avez mentionné: lorsque vous avez appelé bits2.set(1000001) , vous définissez le millionième et le premier bit sur true. Ensuite, lorsque vous avez intersecté avec bits1 , qui avaient les bits 1 million, 111 000 et 111e définis, ils n’avaient aucun bit en commun.

Je pense que ce que tu voulais faire était

  bits2.set(0); // set the 0th bit
 bits2.set(6); // set the 6th bit
 

Est-ce que cela aide à clarifier les choses?

57voto

Peter Lawrey Points 229686

Si vous souhaitez utiliser des bits, vous pouvez utiliser les valeurs int dans Java 7.

 int bits2 = 0b1000001;
int bits1 = 0b1111111;
bits2 &= bits1;
System.out.println(Integer.toBinaryString(bits2));
 

empreintes

 1000001
 

46voto

FauxFaux Points 1204

BitSet n'a pas de méthodes pratiques pour accepter des chaînes de bits comme ça. J'en ai fourni quelques-uns ci-dessous, et maintenant l'exemple fonctionne comme prévu. Notez que cela utilise les fonctionnalités nouvelles de Java 7; Il est facile de trouver des implémentations de ces méthodes en ligne si vous souhaitez utiliser Java 6.

 import java.util.BitSet;

class Scratch {
    public static void main(String[] args) {
        BitSet bits1 = fromString("1000001");
        BitSet bits2 = fromString("1111111");

        System.out.println(toString(bits1)); // prints 1000001
        System.out.println(toString(bits2)); // prints 1111111

        bits2.and(bits1);

        System.out.println(toString(bits2)); // prints 1000001
    }

    private static BitSet fromString(final String s) {
        return BitSet.valueOf(new long[] { Long.parseLong(s, 2) });
    }

    private static String toString(BitSet bs) {
        return Long.toString(bs.toLongArray()[0], 2);
    }
}
 

8voto

Adel Boutros Points 6173

Voici quelques liens à propos de bitSet qui pourrait vous aider:

Mise à JOUR:

Dans la doc, il est dit:

public void set(int bitIndex)

Sets the bit at the specified index to true.

Ainsi, lorsque vous appelez bits2.set(10);, il est considéré comme 10 décimal pas 1 0 de sorte que vous obtenez est le suivant nombre 1000000000.

Pour le régler correctement, dans cet exemple, je veux mettre le 2ème bit à 1, je l'appelle bits2.set(1); , car l'index commence à 0.

En conclusion, pour tous les bits mis à 1, vous devez appeler bitSet.Ensemble, et de les fournir avec l'index du bit.

6voto

Aditya Gaykar Points 151

Je partage mon implémentation pour la création d'un objet BitSet en utilisant une chaîne de bits en entrée.

 private static BitSet createFromString(String s) {
    BitSet t = new BitSet(s.length());
    int lastBitIndex = s.length() - 1;
    int i = lastBitIndex;
    while ( i >= 0) {
        if ( s.charAt(i) == '1'){
            t.set(lastBitIndex - i);            
            i--;
        }
        else
            i--;                
    }
    return t;
}
 

Pour l'entrée de chaîne "1001"

 BitSet s1 = createFromString("1001");
    System.out.println(s1);
 

sortie:

 {0, 3}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X