2012-02-17 13 views
47

Sto cercando un buon esempio di Java BitSet per lavorare con 0 e 1s. Ho provato a guardare i Javadoc ma non capisco l'uso della classe solo leggendo quello. Ad esempio, in che modo i metodi and, or e xor funzionano su due diversi oggetti BitSet?Esempio di bitSet Java

Ad esempio:

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

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

    bits2.and(bits1); 

    System.out.println(bits2); 

Se faccio questo restituisce bits2 come vuoto perché?

+2

http://en.wikipedia.org/wiki/Bitwise_operation - funzionano esattamente come se si usasse '& |^'ecc. con un tipo numerico primitivo. –

+0

Cosa, in particolare, non capisci? Si crea un BitSet e quindi si chiamano funzioni su di esso, come '.and',' .or' e '.xor'. Ciascuna di queste funzioni accetta come parametro un altro oggetto BitSet. – Tony

+0

Beh, ho provato a fare un 'e' nell'esempio sopra e il bitset è diventato vuoto. –

risposta

94

Per il problema specifico che hai citato: quando hai chiamato bits2.set(1000001), hai impostato il milionesimo e il primo bit su true. Quindi, quando si intersecava con bits1, che aveva il milione, 111 mila e 111 ° bit impostati, non avevano bit in comune.

Penso che quello che dire fare era

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

Fa questo aiuto a chiarire le cose?

8

Ecco alcuni collegamenti con BitSet che vi aiutano a:

UPDATE:

nella documentazione, è ha detto:

set public void (int BitIndex)

Sets the bit at the specified index to true. 

Così, quando si chiama bits2.set(10);, esso viene considerato come 10 decimali non così quello che si ottiene è il seguente numero 1000000000 .

Per impostarlo correttamente, in questo esempio, voglio impostare il 2 ° bit su 1, quindi chiamo bits2.set(1); perché l'indice inizia a .

In conclusione, per ogni bit impostato su 1, è necessario chiamare bitSet.Set e fornire l'indice del bit.

39

BitSet non ha metodi convenienti per accettare stringhe di bit del genere. Ne ho fornito alcuni di seguito, e ora l'esempio funziona come ci si aspetterebbe. Si noti che questo utilizza funzionalità nuove in Java 7; è facile trovare implementazioni di questi metodi online, se si desidera utilizzare 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); 
    } 
} 
+1

Perfetto! Mi è piaciuto il tuo metodo 'toString (BitSet bs)'. Molto utile! È possibile invertire i bit per mettere bit_0 a destra. –

52

Se si desidera lavorare con i bit è possibile utilizzare int valori in Java 7.

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

stampe

1000001 
+0

quando li salvi come 'ints' stanno prendendo' 4 byte' o '7 bit'? – daydreamer

+1

@daydreamer Guardando il [codice sorgente] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/BitSet.java) mostra che un 'BitSet' è implementato dietro le quinte come' long [] '. "Il bit ith viene memorizzato nei bit [i/64] nella posizione dei bit i% 64 (dove la posizione dei bit 0 si riferisce al bit meno significativo e 63 si riferisce al bit più significativo)." Quindi, almeno, ogni BitSet utilizzerà 64 bit. Anche il costruttore parametrico dice "Crea un set di bit la cui dimensione iniziale è ** sufficientemente grande ** per rappresentare esplicitamente bit con indici nell'intervallo ..." – mbomb007

4

sto condividendo la mia implementazione per la creazione di un oggetto utilizzando BitSet stringa di bit come input.

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

Per l'ingresso stringa "1001"

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

uscita:

{0, 3} 
+1

Perché stai usando un ciclo while? Un ciclo for farebbe altrettanto bene, dato che stai decrementando 'i' di uno in ogni iterazione. –

+0

Modifica: migliore versione del codice che utilizza il ciclo For, grazie per il suggerimento @ Clément :) –

0

Prova questa:

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(); 

    } 
} 

Spero che questo sia utile. Per ulteriori informazioni, visitare: https://github.com/m-vahidalizadeh/foundations/blob/master/src/data_structures/BitSetExample.java.