2017-01-25 2 views
-11

Ich versuche zu lernen BitSet Sammlung in Java. Ich habe gelesen, dass es Bits im Inneren verwendet.Warum erlaubt Bitset Werte von 1 und 0?

Jeder * Bestandteil des Bit gesetzt hat ein {@code boolean} Wert

ich eine kleine Anwendung geschrieben:

BitSet bitSet = new BitSet(); 
bitSet.set(9); 
bitSet.set(5); 
bitSet.set(3); 
System.out.println(bitSet); 
System.out.println(Arrays.toString(bitSet.toByteArray())); 

Ich fragte mich, dass ich Wert legen kann anders 1 und 0

auch verstehe ich nicht die Ausgabe:

{3, 5, 9} 
[40, 2] 

Bitte erklären Sie mir die Verwendung dieser Sammlung?

+6

https://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html Nichts für ungut - aber ich würde erwarten, dass ein 6k + Benutzer weiß, wie man oracle docs für eine Collection-Klasse sucht, lesen und verstehen Sie es ... – Fildor

+0

@Fildor mein Zitat von dieser Seite, wie Sie sehen können – gstackoverflow

+0

Das macht es nicht besser. Warum hast du die Dokumente nicht verstanden? Wie können wir Ihnen mehr oder bessere Erklärungen geben, als Sie dort lesen können? Für mich ist es ziemlich klar. Ich möchte nur verstehen, warum es nicht für dich ist. – Fildor

Antwort

6

BitSet stellt logisch einen "Vektor von Bits dar, der wie benötigt wächst" (javadoc).

Wenn Sie es über new BitSet() erstellen, haben Sie alle Bits auf 0 gesetzt (false).

0 5 10 
| | | 
000000000000... (virtually infinite sequence) 

Verwendung set(x) Sie auf 1 (wahr), um das Bit an der Position x (wobei die erste Position ist 0); z.B. In Ihrem Code aktivieren Sie die Bits 3, 5 und 9.

0 5 10 
| | | 
000101000100... 

toString() meldet die Liste von Bits auf 1 gesetzt, das heißt 3, 5 und 9 in dem Beispiel.

toByteArray() wandelt den Inhalt der BitSet auf eine Folge von byte Werten, die jeweils den Wert von 8 zusammenhängenden Bits in little-endian Reihenfolge enthält, (das heißt in den BitSet von mindestens Indizes ausgehend). Der Ausgang {40, 2} in Ihrem Beispiel stammt aus:

7  0 15  8 <- position in BitSet 
|  | |  | 
{00101000 , 00000010} <- toByteArray(), binary 
    |   | 
{ 40  , 2 } <- toByteArray(), decimal 

Hoffe, das hilft.

+0

Additional question: wenn ich 'BitSet Bits = new BitSet (8);' deklariere, dann kann ich ohne Probleme 'bits.set (15) ausführen;' oder bits.get (85) abrufen; '(übertrieben, ich weiß , aber nur um den Punkt zu zeigen). Wenn ich auf die Implementierung von 'public void set (int bitIndex)' in 'BitSet.java' schaue, dann sehe ich nur eine Ausnahme, wenn der Index negativ ist (ausreichend). Aber warum nicht, wenn Sie die max. Anzahl der im Konstruktor gesetzten Bits? Ich habe auch gesehen, dass der Konstruktor 'public BitSet (int nbits)' keine lokale Variable enthält, um die Anzahl der im Konstruktor übergebenen Bits zu verfolgen ... – GeertVc

+1

@GeertVc Das N, das du an 'new BitSet' übergibst (N) ist wie eine geschätzte Größe des Bitsatzes und wird verwendet, um den internen Bitspeicher zuzuordnen. Wenn Sie ein Bit über eine solche Größe setzen, muss das BitSet den internen Speicher erweitern, um es zuzuweisen, aber es erlaubt es immer noch. Das gleiche Prinzip wird in anderen 'java.util' Collection-Klassen verwendet, z.B. 'new ArrayList (10)' erstellt eine Liste, die anfänglich von einem Array der Größe 10 unterstützt wird. Es können jedoch auch mehr als 10 Elemente hinzugefügt werden, die bei Bedarf ein größeres Array zuweisen. – rrobby86

4

BitSet.set(int bitIndex) setzt das Bit am angegebenen Index auf True.

So bitSet.set(9); Flips Bitzahl 9-1

Am Ausgang:

  • System.out.println(bitSet); druckt das Ergebnis von toString die nach JavaDoc ist:

für jeden Index, für die Dieses BitSet enthält ein Bit im gesetzten Zustand, die dezimale Darstellung dieses Index ist im Ergebnis enthalten. S

Schritt für Schritt, spaltet sie die Binärdatei Set: 1000101000

an Bytes 10 00101000

die 2 und 40 in dezimaler ist.

7

Sie stellen die Bits Nummer 3, 5 und 9:

byte#  1     0 
index … 9 8 7 6 5 4 3 2 1 0 
value … 1 0 0 0 1 0 1 0 0 0 

Binary 10 dezimal 2 (2¹ = 2).

Binär 00101000 ist dezimal 40 (2³ + 2⁵ = 8 + 32 = 40).

+0

was ist mit 2^9? – gstackoverflow

+0

@gstackoverflow ein Byte ist 8 Bits breit. Also 2^9 endet in einem zweiten Byte, also wird 00000010 => 2 im Byte mit Index 1 sein. – Fildor

+0

aaaaa, danke. Ich verstehe – gstackoverflow