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:
- http://www.java-samples.com/showtutorial.php?tutorialid=378
- http://www.codeguru.com/java/tij/tij0090.shtml
- http://imagenious.wordpress.com/2008/02/05/java-bitset-vs-primitive/
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