Как разделить битовый массив

Мне нужно разделить BitArray (из std.bitmanip) на его половины. До сих пор я обнаружил, что нарезка не реализована, итерация по ней и добавление или назначение неизменно приводит к исключению Out of range. Я попытался преобразовать его в какой-то другой тип (он подходит для long/ulong), но это кажется слишком сложным, и это также дает мне исключение вне диапазона, когда я пытаюсь инициализировать новые BitArrays, как показано ниже:

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

Есть ли более простое решение моей проблемы? Если нет, то что я делаю неправильно?


person Byakkun    schedule 24.06.2011    source источник


Ответы (1)


Что плохого в том, чтобы сделать это наивным способом?

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

Я попробовал это на небольшом тестовом примере, и у меня это сработало.

Причина, по которой ваш код не работает, заключается в том, что длина массива C равна нулю, поэтому доступ к C[0] недопустим. Сначала вам нужно добавить пустой BitArray.

C ~= BitArray();

Или, как вариант, используйте статический массив:

BitArray[1] C, D;

Примечание. Если вам не нужно сохранять исходный массив, вы можете разрезать его пополам, просто используя:

A.length /= 2;

Конечно, сначала вам нужно скопировать вторую половину.

person Peter Alexander    schedule 24.06.2011
comment
Спасибо! Я только что пошел простым путем, сделав свои массивы статическими, потому что мне очень нужно немного поспать. В следующий раз попробую наивный способ. - person Byakkun; 25.06.2011