Je cherche un bon exemple BitSet
Java pour travailler avec 0 et 1. J'ai essayé de regarder les Javadocs mais je ne comprends pas l'utilisation de la classe en lisant simplement cela. Par exemple, comment les méthodes and
, or
et xor
fonctionnent-elles sur deux objets BitSet
différents?
Par exemple:
BitSet bits1 = new BitSet();
BitSet bits2 = new BitSet();
bits2.set(1000001);
bits1.set(1111111);
bits2.and(bits1);
System.out.println(bits2);
Si je le fais, il renvoie bits2
comme vide. Pourquoi?
Pour le problème spécifique que vous avez mentionné: lorsque vous avez appelé bits2.set(1000001)
, vous définissez le millionième et le premier bit sur true. Ensuite, lorsque vous avez intersecté avec bits1
, qui avait les bits 1 million, 111 000 et 111e défini, ils n’avaient aucun bit en commun.
Je pense que ce que vous vouliez faire était
bits2.set(0); // set the 0th bit
bits2.set(6); // set the 6th bit
Est-ce que cela aide à clarifier les choses?
Si vous souhaitez utiliser des bits, vous pouvez utiliser les valeurs int
dans Java 7.
int bits2 = 0b1000001;
int bits1 = 0b1111111;
bits2 &= bits1;
System.out.println(Integer.toBinaryString(bits2));
empreintes
1000001
BitSet n'a pas de méthodes pratiques pour accepter des chaînes de bits comme ça. J'en ai fourni quelques-uns ci-dessous, et maintenant l'exemple fonctionne comme prévu. Notez que cela utilise les fonctionnalités nouvelles de Java 7; Il est facile de trouver des implémentations de ces méthodes en ligne si vous souhaitez utiliser 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);
}
}
Voici quelques liens sur bitSet qui pourraient vous aider:
METTRE À JOUR:
Dans la documentation, il est dit:
ensemble vide public (int bitIndex)
Sets the bit at the specified index to true.
Ainsi, lorsque vous appelez bits2.set(10);
, il est considéré comme 10 décimal et non 1 0; vous obtenez donc le nombre suivant 1000000000
.
Pour le définir correctement, dans cet exemple, je souhaite définir le 2e bit sur 1; j'appelle donc bits2.set(1);
car l'index commence à 0.
En conclusion, pour chaque bit défini sur 1, vous devez appeler bitSet.Set et lui fournir l’index du bit.
Je partage mon implémentation pour la création d'un objet BitSet en utilisant une chaîne de bits comme entrée.
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;
}
Pour l'entrée de chaîne "1001"
BitSet s1 = createFromString("1001");
System.out.println(s1);
sortie:
{0, 3}
Essaye ça:
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();
}
}
J'espère que c'est utile. Pour plus d'informations, visitez le site: https://github.com/m-vahidalizadeh/foundations/blob/master/src/data_structures/BitSetExample.Java .