开发者

How to split a BitArray

开发者 https://www.devze.com 2023-03-15 16:59 出处:网络
I need to split an BitArray (from std.bitmanip) into its halfs. Until now I\'ve found out that slicing is not implemented, iterating over it and appending or assigning produces Out of range exception

I need to split an BitArray (from std.bitmanip) into its halfs. Until now I've found out that slicing is not implemented, iterating over it and appending or assigning produces Out of range exception invariably. I've开发者_开发知识库 tried to convert it into some other type (it fits into long/ulong) but that seems like too much trouble and it also give me an out of range exception when i try to init the new BitArrays as seen below:

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

Is there a simpler solution for my problem? If not, what am I doing wrong?


What's wrong with doing it the naive way?

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

I tried this on a little test case and it worked fine for me.

The reason your code doesn't work is because the length of array C is zero, so accessing C[0] is illegal. You'd need to add an empty BitArray first.

C ~= BitArray();

Or, alternatively, use a static array:

BitArray[1] C, D;

Note: If you don't need to keep the original array, then you can cut it in half by simply using:

A.length /= 2;

Of course, you'll need to copy the second half first.

0

精彩评论

暂无评论...
验证码 换一张
取 消