我需要将BitArray(从std.bitmanip)分成两半.到目前为止,我已经发现切片没有实现,迭代它并且追加或分配产生超出范围的异常.我试图将它转换为其他类型(它适合long/ulong)但这似乎太麻烦了,当我尝试初始化新的BitArrays时它也会给我一个超出范围的异常,如下所示:
BitArray[] C, D;
long lg = toLong(bitArr);
C[0].init(cast(void[])((lg >> 28) & 0x0fff_ffff), 28);
Run Code Online (Sandbox Code Playgroud)
对我的问题有一个更简单的解决方案吗?如果没有,我做错了什么?
以天真的方式做这件事有什么问题?
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];
Run Code Online (Sandbox Code Playgroud)
我在一个小测试用例上尝试了这个,它对我来说很好.
您的代码不起作用的原因是因为数组的长度C为零,因此访问C[0]是非法的.你需要先添加一个空的BitArray.
C ~= BitArray();
Run Code Online (Sandbox Code Playgroud)
或者,使用静态数组:
BitArray[1] C, D;
Run Code Online (Sandbox Code Playgroud)
注意:如果您不需要保留原始数组,那么只需使用以下命令即可将其切成两半:
A.length /= 2;
Run Code Online (Sandbox Code Playgroud)
当然,你需要先复制下半场.