2012-05-08 11 views
7

Ho bisogno di un BitSet che consenta una facile concatenazione di più BitSet per creare un nuovo BitSet. Il default implementation non ha un tale metodo.BitSet Java che consente una facile concatenazione di BitSet

Esiste qualche implementazione in qualche libreria esterna che qualcuno di voi sa che consente una concatenazione facile?

Ad esempio, diciamo che ho un bitarray 11111 e un altro array di bit 010101. Voglio funzionalità come l'accodamento. Quindi dopo la concatenazione risulterebbe in 11111010101.

+2

Dal momento che un BitSet ha dimensioni significative o la lunghezza (tranne il bit più alto set), è un po 'difficile da capire che cosa si intende con concatenazione. – jarnbjo

+0

@jarnbjo Ho modificato la domanda. Spero che abbia senso ora. –

+2

Non è "concatenazione". Questo è left-shifting e OR-ing. Dubito che sarai in grado di trovare una definizione coerente della tua versione di concatenazione. Ad esempio, perché osservate lo zero iniziale nel '010101' nel vostro esempio e ignorate l'infinito di altri zeri iniziali? – EJP

risposta

3

Beh, non c'è modo di implementare questa memoria terribilmente efficiente (prestazioni e) poiché non esiste un metodo a sinistra.

Quello che puoi fare è utilizzare l'ovvio nextSetBit per loop - lento, ma efficiente per la memoria.

Il metodo presumibilmente più veloce sarebbe quello di utilizzare toLongArray su uno, copiare quello spostato correttamente in una matrice abbastanza grande, creare un set di bit da quello o con l'altro. In questo modo non esegui alcun bithifting su singoli bit, ma lavori su blocchi di parole.

1

questo ha funzionato per me:

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; 
} 

Risultato: 11111010101

Problemi correlati