Ejemplo de Java BitSet

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 BitSet diferentes?

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, devuelve bits2 como vacío ¿por qué es eso?

Para el problema específico que mencionaste: cuando bits2.set(1000001) , estableciste la millonésima y el primer bit en verdadero. Luego, cuando te bits1 con los bits1 , que tenían el millón, el 111 mil y el 111er bit establecidos, no tenían bits en común.

Creo que lo que pretendías hacer era

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

¿Esto ayuda a aclarar las cosas?

Si desea trabajar con bits, puede usar valores int en Java 7.

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

huellas dactilares

 1000001 

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 encontrar implementaciones de estos métodos en línea si desea usar 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); } } 

Aquí hay algunos enlaces sobre bitSet que lo ayudarán a:

ACTUALIZAR:

En los documentos, se dice:

conjunto de vacío público (int bitIndex)

 Sets the bit at the specified index to true. 

Entonces cuando llamas bits2.set(10); , se considera como 10 decimal, no 1 0, por lo que lo que obtienes es el siguiente número 1000000000 .

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

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

Estoy compartiendo mi implementación para crear un objeto BitSet utilizando una 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); 

salida:

 {0, 3} 

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 sea útil. Para obtener más información, visite: https://github.com/m-vahidalizadeh/foundations/blob/master/src/data_structures/BitSetExample.java .

    Intereting Posts