6

System.Collections.BitArray 配列 (~3000 アイテム) があり、すべてのビットを 1 だけ左にシフトしたいと考えています。ただし、コレクションはその操作をサポートしていないようです (つまり、bitArray << 1 が機能せず、そこに方法はありません)。それを行う方法について何か考えはありますか?

ありがとう!

4

5 に答える 5

6

この単純なスニペットは、手動で行う方法を示しています。の値bitArray[0]は上書きされます:

//... bitArray is the BitArray instance

for (int i = 1; i < bitArray.Count; i++)
{
   bitArray[i - 1] = bitArray[i];
}

bitArray[bitArray.Count - 1] = false // or true, whatever you want to shift in

これを拡張メソッドにすることは大したことではありません。

于 2010-09-10T11:09:51.340 に答える
2

効率はよくわかりませんが、この拡張方法でうまくいきます

public static BitArray ShiftRight(this BitArray instance)
{
    return new BitArray(new bool[] { false }.Concat(instance.Cast<bool>().Take(instance.Length - 1)).ToArray());
}
于 2011-10-08T12:29:05.057 に答える
2

System.Numerics.BigInteger は実際にビット シフトをサポートしています。

于 2011-08-04T22:25:39.083 に答える
1

ラッパーとして自分でビット配列を再作成しますulong[]; 64よりも小さい数でビットシフトを実装することは、そのように簡単なことであり、他の提案されたアプローチよりも時間がかからず、ホッキョクグマを殺すことが少なくなります。「終わりに落ちるビット」に注意することにより、それらを保持したい場合は、配列を拡張する必要があります(または、それらがゼロであり、存在しない要素が暗黙的にゼロを保持すると言う場合)。

于 2011-10-08T12:37:21.160 に答える
0

頭のてっぺんから離れる最も簡単な方法は、BitArrayをBigIntまたはビット単位のシフトとバックをサポートする同様の構造に変換することです。さて、.Net 4に組み込まれているBigIntegerはシフトをサポートしていないと思いますが、Monoの実装のようにサポートしているものもあります。

于 2010-09-10T12:18:28.697 に答える