0

私は巨大な長さの整数配列を持っています。例: {2, 3, 4, 2, 4, 2, 1, 4, ....}。これを C# の BitArrays の配列に変換したいと思います。つまり、010 011 100 010 100 010 001 100

したがって、これを 3 つの BitArrays (一番左のビットの bitarray、真ん中のビットの bitarray、一番右のビットの bitarray) に変更できます。

ここでの問題は、0/1 を直接格納できる Java の bitset とは異なり、bitarray には true/false のみを含めることができることです。そして、この配列は非常に長いので、if/else を使用したくありません。

for(int i=0; i<N; i++)
   if (bit is 0) then  // time consuming step
       leftMostbitArray[0] = false;
   else
       leftMostbitArray[0] = true;

この手順を省略できる回避策はありますか? または、おそらく別のデータ構造です。サイズ制限があるため、BitVector32 を使用したくありません。

ありがとう。

4

1 に答える 1

1

これを試して:

int[] a = new int[] { 2, 3, 4, 2, 4, 2, 1, 4 };
BitArray b0 = new BitArray(a.Select(v => (v & (1 << 0)) != 0).ToArray());
BitArray b1 = new BitArray(a.Select(v => (v & (1 << 1)) != 0).ToArray());
BitArray b2 = new BitArray(a.Select(v => (v & (1 << 2)) != 0).ToArray());

にはb0、「ビット位置 0」または右端のビットがあります。次に、b1b2のビットが左に、次のビットが左に、というようになります。必要に応じて、さらに行を追加して追加のビットを取得できます。ビット シフト パラメーター ( 1 << #) に 1 つ追加し続けるだけです。

また、true/false を使用して BitVector を本当に気にかけているのかどうかもわかりませんでした。これと 0/1 の保存の間に機能上の違いはありません。本当に0/1 を格納する必要があり、メモリの浪費を気にしない場合は、代わりに次の構文を使用できます。

int[] vb0 = a.Select(v => (v & (1 << 0)) != 0 ? 1 : 0).ToArray()
...etc... 
于 2013-07-07T19:08:26.120 に答える