java bitset

Ejemplo de BitSet de Java



(6)

Estoy buscando un buen ejemplo de Java BitSet para trabajar con 0 y 1s. Intenté mirar los Javadocs pero no entiendo el uso de la clase con solo leer eso. Por ejemplo, ¿cómo funcionarán los métodos y, y, 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?


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

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 obtiene el siguiente número 1000000000 .

Para configurarlo correctamente, en este ejemplo, quiero establecer el segundo bit en 1, por lo que llamo bits2.set(1); porque el índice comienza en 0

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


BitSet no tiene métodos convenientes para aceptar cadenas de bits como esa. He proporcionado algunos a continuación, y ahora el ejemplo funciona como cabría esperar. Tenga en cuenta que esto utiliza la funcionalidad nueva en Java 7; es fácil 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); } }


Estoy compartiendo mi implementación para crear un objeto BitSet usando 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 entrada de cadena "1001"

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

salida:

{0, 3}


Para el problema específico que mencionaste: cuando bits2.set(1000001) , configuraste el bit un millonésimo y el primero en verdadero. Luego, cuando se intersectó con bits1 , que tenía un millón, 111 mil y 111 bits establecidos, no tenían bits en común.

Creo que lo que querías hacer era

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

¿Esto ayuda a aclarar las cosas?


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 .


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

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

huellas dactilares

1000001