2012-02-17 20 views
47

Estoy buscando un buen ejemplo de Java BitSet para trabajar con 0 y 1s. Traté de ver los Javadocs, pero no entiendo el uso de la clase simplemente leyendo eso. Por ejemplo, ¿cómo funcionarían los métodos and, or y xor en dos objetos diferentes BitSet?Java BitSet Ejemplo

Por ejemplo:

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

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

    bits2.and(bits1); 

    System.out.println(bits2); 

Si hago esto vuelve bits2 tan vacía por qué es eso?

+2

http://en.wikipedia.org/wiki/Bitwise_operation - funcionan exactamente igual que si estuvieras usando '& |^'etc. con un tipo numérico primitivo. –

+0

¿Qué, específicamente, no entiendes? Usted crea un BitSet y luego llama a funciones en él, como '.and',' .or' y '.xor'. Cada una de estas funciones toma como parámetro otro objeto BitSet. – Tony

+0

Bueno, traté de hacer un 'y' en el ejemplo anterior y el conjunto de bits se vació. –

Respuesta

94

Para el problema específico que mencionaste: cuando llamaste a bits2.set(1000001), estableciste la millonésima y la primera parte en verdadero. Luego, cuando se cruzó con bits1, que tenía un millón, 111 mil y un conjunto de 111 bits, no tenían bits en común.

Creo que lo que quería decir que hacer era

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

¿Esto ayuda aclarar las cosas?

8

Éstos son algunos enlaces sobre BitSet que le ayudaría a:

ACTUALIZACIÓN:

En los documentos, es dijo:

conjunto public void (int BitIndex)

Sets the bit at the specified index to true. 

Así que cuando se llama a bits2.set(10);, se considera como 10 decimal no así que lo que se obtiene es el siguiente número 1000000000 .

Para configurarlo correctamente, en este ejemplo, quiero establecer el 2do bit en 1, así que llamo a bits2.set(1); porque el índice comienza en .

En conclusión, para cada bit establecido en 1, debe llamar a bitSet.Set y proporcionarle el índice del bit.

39

BitSet no tiene métodos de conveniencia para aceptar cadenas de bits como esa. He proporcionado algunos a continuación, y ahora el ejemplo funciona como era de esperar. Tenga en cuenta que esto utiliza una funcionalidad nueva en Java 7; es fácil de encontrar implementaciones de estos métodos en línea si desea utilizar 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

¡Perfecto! Me gustó tu método 'toString (BitSet bs)'. ¡Muy útil! Podría invertir los bits para poner bit_0 a la derecha. –

52

Si se desea trabajar con los bits puede utilizar int valores en Java 7.

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

impresiones

1000001 
+0

cuando los guardas como 'ints' ¿están tomando' 4 byte' o '7 bits'? – daydreamer

+1

@daydreamer Al mirar el [código fuente] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/BitSet.java) se muestra que un 'BitSet' se implementa detrás de escena como' long [] '. "El bit i-ésimo se almacena en los bits [i/64] en la posición de bit i% 64 (donde la posición de bit 0 se refiere al bit menos significativo y 63 se refiere al bit más significativo)". Entonces, como mínimo, cualquier BitSet usará 64 bits. Incluso el constructor parametrizado dice "Crea un conjunto de bits cuyo tamaño inicial es ** lo suficientemente grande ** para representar explícitamente bits con índices en el rango ..." – mbomb007

4

estoy compartiendo mi aplicación para la creación de un objeto utilizando BitSet cadena de bits como entrada.

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

Para la entrada de cadena "1001"

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

de salida:

{0, 3} 
+1

¿Por qué está utilizando un ciclo while? Un bucle for funcionaría igual de bien, ya que está disminuyendo 'i' por uno en cada iteración. –

+0

Editar: Mejor versión del código que utiliza For loop, gracias por la sugerencia @ Clément :) –

0

Prueba esto:

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

    } 
} 

espero que esto es útil. Para obtener más información, visite: https://github.com/m-vahidalizadeh/foundations/blob/master/src/data_structures/BitSetExample.java.