java.util.BitSet - set () funktioniert nicht wie erwartet

7

Vermisse ich etwas schmerzhaft offensichtlich? Oder benutzt eigentlich niemand auf der Welt java.util.BitSet?

Der folgende Test schlägt fehl:

%Vor%

Es ist mir wirklich unklar, warum ich nicht mit einem BitSet der Länge 2 und dem Wert 10 gelandet bin. Ich habe die Quelle für java.util.BitSet angeschaut, und bei Gelegenheitsinspektionen scheint es nicht ausreichend zu sein zwischen einem Bit, das falsch gesetzt wurde und einem Bit, das nie auf einen Wert gesetzt wurde ...

(Beachten Sie, dass das explizite Festlegen der BitSet-Größe im Konstruktor keine Auswirkung hat, z. B .:

%Vor%     
denishaskin 18.05.2010, 01:40
quelle

6 Antworten

6

Leute benutzen BitSet ; Sie verwenden es jedoch für etwas anderes als das, was Sie beabsichtigen. Es ist wahrscheinlich am besten, sich BitSet als eine sehr kompakte, speichereffiziente Form von Set<Integer> vorzustellen, die die besondere Eigenschaft hat, dass Sie keine negativen Zahlen darin einfügen können.

Es ist sehr üblich mit BitSet s, sie im Muster von

zu verwenden %Vor%

nachdem du etwas getan hast, um sie zu füllen. Dies entspricht einer Iteration über die Elemente von Set .

    
Daniel Martin 18.05.2010, 02:21
quelle
8

Ihr höchstes gesetztes Bit (wie in "set to 1") ist Bit 0. Also sollte die Länge 1 sein.

Siehe JavaDoc für die Länge :

  

public int length ()

     

Gibt die "logische Größe" dieses BitSets zurück: den Index des höchsten gesetzten Bits im BitSet plus eins. Gibt Null zurück, wenn das BitSet keine gesetzten Bits enthält.

Vielleicht suchen Sie size obwohl es möglich ist, dass es höher sein kann als zwei, wenn Bits mit einer bestimmten Auflösung zugewiesen werden (sagen wir 16-Bit-Grenzen)?

    
ZZ Coder 18.05.2010 01:43
quelle
3

Das verwirrte mich auch, ich bin mir nicht sicher, was hinter BitSets aktueller, ziemlich unerwarteter Funktionalität steht. Da es jedoch nicht endgültig ist, können wir Taktiken für Umarmungen und Erweiterungen verwenden und das Folgende tun, um ein festes BitSet mit Längensemantik wie erwartet zu erhalten:

%Vor%     
Casper Bang 20.09.2010 21:10
quelle
2

Vorausgesetzt, dass das Bitset von einem langen [] unterstützt wird, ist die Mindestgröße 64 (weil 1 lang 64 Bits ist). Die Größe wird um ein Vielfaches von 64 inkrementiert, und aus irgendeinem Grund haben sie die Anzahl der Bits, die Sie darstellen wollten, nicht beibehalten, wenn Sie den Konstruktor verwenden, der einen Int-Wert annimmt.

    
Sanjeev 28.08.2010 22:39
quelle
1

// Abhay Dandekar

%Vor%

Ein einfaches Java-Programm, um zu zeigen, was im Inneren passiert. Einige Punkte zu beachten:

  1. BitSet wird von einem langen

  2. unterstützt
  3. Alle Standardwerte sind falsch

  4. Bei der Rückgabe der Länge wird der Index + 1 des höchsten "wahren" Wertes in der Menge zurückgegeben.

Die Ausgabe unten sollte sich erklären können:

%Vor%

Also Punkte zum Schluss:

  1. Verwenden Sie nicht die Länge, um die Anzahl der modifizierten Bits zu beenden

  2. Kann in Szenarien wie Bloomfiltern verwendet werden. Mehr über Bloom Filter können gegoogelt werden ..;)

Hoffe, das hilft

Grüße,

Abhay Dandekar

    
Abhay Dandekar 18.04.2014 06:59
quelle
0

Guter Casper! Ihre kleine Verbesserung sollte tatsächlich im ursprünglichen BitSet Java Def vorhanden gewesen sein! Ich schlage auch vor, dass (append () und concat () für verschiedene Verwendungen nützlich sind)

%Vor%     
gonzepge 22.01.2014 06:58
quelle

Tags und Links