5

BitArray(std.bitmanipから)を半分に分割する必要があります。これまで、スライスが実装されていないことを発見しました。スライスを繰り返して追加または割り当てると、常に範囲外の例外が発生します。私はそれを他のタイプに変換しようとしました(長い/長いものに収まります)が、それはあまりにも厄介なようで、以下に示すように新しいBitArrayを初期化しようとすると範囲外の例外が発生します:

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

私の問題に対するより簡単な解決策はありますか?そうでない場合、私は何を間違っていますか?

4

1 に答える 1

5

素朴な方法でそれを行うことの何が問題になっていますか?

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;

もちろん、最初に後半をコピーする必要があります。

于 2011-06-24T16:08:31.243 に答える