web-dev-qa-db-fra.com

Exemple de BitSet Java

Je cherche un bon exemple BitSet Java 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 BitSet différents?

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?

52
Steffan Harris

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 avait les bits 1 million, 111 000 et 111e défini, ils n’avaient aucun bit en commun.

Je pense que ce que vous vouliez faire était

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

Est-ce que cela aide à clarifier les choses?

101
Louis Wasserman

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
56
Peter Lawrey

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);
    }
}
42
FauxFaux

Voici quelques liens sur bitSet qui pourraient vous aider: 

METTRE À JOUR:

Dans la documentation, il est dit:

ensemble vide public (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 et non 1 0; vous obtenez donc le nombre suivant 1000000000.

Pour le définir correctement, dans cet exemple, je souhaite définir le 2e bit sur 1; j'appelle donc bits2.set(1); car l'index commence à 0.

En conclusion, pour chaque bit défini sur 1, vous devez appeler bitSet.Set et lui fournir l’index du bit.

8
Adel Boutros

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

private static BitSet createFromString(String s) {
    BitSet t = new BitSet(s.length());
    int lastBitIndex = s.length() - 1;

    for (int i = lastBitIndex; i >= 0; i--) {
        if ( s.charAt(i) == '1'){
            t.set(lastBitIndex - i);                            
        }               
    }

    return t;
}

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

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

sortie:

{0, 3}
5
Aditya Gaykar

Essaye ça:

import Java.util.BitSet;

public class BitSetExample {

    public static void main(String args[]){
        BitSet bits1 = new BitSet(7);
        BitSet bits2 = new BitSet(7);

        // set some bits
        for(int i = 0; i < 7; i++) {
            if((i % 2) == 0) bits1.set(i);
            if((i % 3) != 0) bits2.set(i);
        }

        System.out.println("BitSet1: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits1.get(i)? "1 ": "0 ");
        }

        System.out.println("\nBitSet2: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits2.get(i)? "1 ": "0 ");
        }

        System.out.println();

        //And
        bits1.and(bits2);

        System.out.println("b1 = b1 AND b2\nBitSet1: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits1.get(i)? "1 ": "0 ");
        }

        System.out.println();
        System.out.println("BitSet2: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits2.get(i)? "1 ": "0 ");
        }

        System.out.println();

        //Or
        bits1.or(bits2);

        System.out.println("b1 = b1 OR b2\nBitSet1: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits1.get(i)? "1 ": "0 ");
        }

        System.out.println();
        System.out.println("BitSet2: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits2.get(i)? "1 ": "0 ");
        }

        System.out.println();

        //Xor
        bits1.xor(bits2);

        System.out.println("b1 = b1 XOR b2\nBitSet1: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits1.get(i)? "1 ": "0 ");
        }

        System.out.println();
        System.out.println("BitSet2: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits2.get(i)? "1 ": "0 ");
        }

        System.out.println();

        //Setting bits to zero and one
        bits1.set(1);
        bits2.set(1,false);

        System.out.println("set bit 1 of BitSet1 to one and set bit 1 of BitSet2 to zero\nBitSet1: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits1.get(i)? "1 ": "0 ");
        }

        System.out.println();
        System.out.println("BitSet2: ");

        for(int i = 0; i < 7; i++) {
            System.out.print(bits2.get(i)? "1 ": "0 ");
        }

        System.out.println();

    }
}

J'espère que c'est utile. Pour plus d'informations, visitez le site: https://github.com/m-vahidalizadeh/foundations/blob/master/src/data_structures/BitSetExample.Java .

0
Vahid