2012-05-08 5 views
7

Ich benötige ein BitSet, das eine einfache Verkettung mehrerer BitSets ermöglicht, um ein neues BitSet zu erstellen. Die default implementation hat keine solche Methode.Java BitSet, das eine einfache Verkettung von BitSets ermöglicht

Gibt es irgendeine Implementierung in einer externen Bibliothek, von der jeder von Ihnen weiß, was eine einfache Verkettung erlaubt?

Zum Beispiel sagen wir, ich habe ein Bitarray 11111 und ein anderes Bit-Array 010101. Ich möchte Funktionalität wie das Anhängen. Also nach der Verkettung würde es 11111010101 ergeben.

+2

Da ein BitSet keine sinnvolle Größe oder Länge hat (mit Ausnahme der höchsten gesetzten Bit), ist es ein bisschen schwer zu verstehen, was Sie meinen mit Verkettung. – jarnbjo

+0

@jarnbjo Ich habe die Frage bearbeitet. Hoffe es macht jetzt Sinn. –

+2

Das ist keine Verkettung. Das ist Linksverschiebung und ODER-Verknüpfung. Ich bezweifle, dass Sie in der Lage sein werden, eine kohärente Definition Ihrer Version der Verkettung zu finden. Warum zum Beispiel die führende Null in '010101' in Ihrem Beispiel beobachten und die Unendlichkeit anderer führender Nullen ignorieren? – EJP

Antwort

3

Nun, es gibt keine Möglichkeit, diese furchtbar effizient zu implementieren (Leistung und Speicher, die ist), da es keine Linksverschiebungsmethode gibt.

Was Sie tun können, ist entweder die offensichtliche nextSetBit for-Schleife - langsam, aber effizient zu verwenden.

Die vermutlich schnellere Methode wäre, toLongArray auf einem zu verwenden, Kopie, die richtig in ein groß genug Array verschoben wurde, ein Bitset von diesem und oder es mit dem anderen zu erstellen. Auf diese Weise machen Sie kein Bitshifting für einzelne Bits, sondern arbeiten stattdessen mit Wörtern in Chunks.

1

Das ist für mich gearbeitet:

BitSet concatenate_vectors(BitSet vector_1_in, BitSet vector_2_in) { 
    BitSet vector_1_in_clone = (BitSet)vector_1_in.clone(); 
    BitSet vector_2_in_clone = (BitSet)vector_2_in.clone(); 
    int n = 5;//_desired length of the first (leading) vector 
    int index = -1; 
    while (index < (vector_2_in_clone.length() - 1)) { 
    index = vector_2_in_clone.nextSetBit((index + 1)); 
    vector_1_in_clone.set((index + n)); 
    } 
    return vector_1_in_clone; 
} 

Ergebnis: 11111010101