2011-06-24 19 views
5

Necesito dividir un BitArray (de std.bitmanip) en sus partes intermedias. Hasta ahora descubrí que el corte no está implementado, iterar sobre él y agregar o asignar produce invariablemente una excepción fuera de rango. Intenté convertirlo en otro tipo (encaja en long/ulong) pero parece demasiado problema y también me da una excepción fuera de rango cuando intento iniciar las nuevas BitArrays como se ve a continuación:Cómo dividir un BitArray

BitArray[] C, D; 
long lg = toLong(bitArr); 
C[0].init(cast(void[])((lg >> 28) & 0x0fff_ffff), 28); 

¿Existe una solución más simple para mi problema? Si no, ¿qué estoy haciendo mal?

Respuesta

5

¿Qué hay de malo en hacerlo de la manera ingenua?

BitArray A, B, C; 
A = /* ... */ 

// Split A into B & C 
auto n = A.length; 
B.length = n/2; 
foreach (i; 0..n/2) 
    B[i] = A[i]; 

C.length = n - n/2; 
foreach (i; n/2..n) 
    C[i-n/2] = A[i]; 

He intentado esto en un caso de prueba poco y funcionó bien para mí.

La razón por la que su código no funciona es porque la longitud de la matriz C es cero, por lo que acceder a C[0] es ilegal. Tendrías que agregar primero un BitArray vacío.

C ~= BitArray(); 

O, alternativamente, utilizar una matriz estática:

BitArray[1] C, D; 

Nota: Si no es necesario para mantener la matriz original, entonces se puede cortar por la mitad por el simple uso:

A.length /= 2; 

Por supuesto, tendrá que copiar la segunda mitad primero.

+0

¡Gracias! He ido por el camino fácil de hacer que mis matrices estén estáticas porque necesito dormir un poco. Trataré de la manera ingenua la próxima vez. – Byakkun