2012-05-08 24 views
7

Necesito un BitSet que permita una fácil concatenación de múltiples BitSets para crear un nuevo BitSet. El default implementation no tiene dicho método.Java BitSet que permite la fácil Concatenación de BitSets

¿Existe alguna implementación en alguna biblioteca externa que cualquiera de ustedes sepa que permita una fácil concatenación?

Por ejemplo, digamos que tengo un bitarray 11111 y otro arreglo de bits 010101. Quiero funcionalidad como agregar. Por lo tanto, después de la concatenación daría como resultado 11111010101.

+2

Desde un BitSet no tiene tamaño significativa o longitud (excepto la más alta conjunto de bits), es un poco difícil de entender lo que quiere decir con concatenación. – jarnbjo

+0

@jarnbjo He editado la pregunta. Espero que tenga sentido ahora. –

+2

Eso no es 'concatenación'. Eso es desplazamiento a la izquierda y OR-ing. Dudo que pueda llegar a una definición coherente de su versión de concatenación. Por ejemplo, ¿por qué observar el cero inicial en '010101' en su ejemplo, e ignorar el infinito de otros ceros a la izquierda? – EJP

Respuesta

3

Bueno, no hay forma de implementar esta memoria tremendamente eficiente (rendimiento y) porque no hay un método de desplazamiento a la izquierda.

Lo que puede hacer es usar el obvio nextSetBit para bucle lento, pero eficiente en la memoria.

El método presumiblemente más rápido sería usar toLongArray en uno, copiarlo correctamente desplazado en un conjunto lo suficientemente grande, crear un conjunto de bits a partir de ese y/o con el otro. De esta forma, no realizas ningún cambio de bits en bits individuales, sino que trabajas en fragmentos de palabras.

1

Esto funcionó para mí:

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

Resultado: 11111010101