2011-06-24 11 views
5

Potrzebuję podzielić bitArray (od std.bitmanip) na jego halfs. Do tej pory odkryłem, że krojenie nie jest zaimplementowane, iteracja nad nim i dołączanie lub przypisywanie powoduje niezmiennie wyjątek Poza zasięgiem. Próbowałem przekonwertować go na inny typ (pasuje do długiego/ulong), ale wydaje się to zbyt dużym kłopotem, a także daje mi wyjątek poza zasięgiem, kiedy próbuję zainicjować nowe BitArrays, jak widać poniżej:Jak podzielić bitArray

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

Czy istnieje prostsze rozwiązanie dla mojego problemu? Jeśli nie, co robię źle?

Odpowiedz

5

Co jest nie tak z robieniem tego naiwnego?

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

Próbowałem tego na małej testowej skrzynce i działało dobrze dla mnie.

Powód, dla którego twój kod nie działa, ponieważ długość tablicy C wynosi zero, więc dostęp do C[0] jest nielegalny. Najpierw musisz dodać pusty BitArray.

C ~= BitArray(); 

Lub alternatywnie użyć statycznej tablicy:

BitArray[1] C, D; 

Uwaga: Jeśli nie ma potrzeby, aby zachować oryginalną tablicę, potem można wyciąć go na pół używając zwyczajnie:

A.length /= 2; 

Oczywiście najpierw musisz skopiować drugą połowę.

+0

Dziękujemy! Właśnie udałem się w łatwy sposób, dzięki czemu moje tablice stały się statyczne, ponieważ potrzebuję trochę snu. Spróbuję naiwny sposób następnym razem. – Byakkun