System.Collections.BitArray 配列 (~3000 アイテム) があり、すべてのビットを 1 だけ左にシフトしたいと考えています。ただし、コレクションはその操作をサポートしていないようです (つまり、bitArray << 1 が機能せず、そこに方法はありません)。それを行う方法について何か考えはありますか?
ありがとう!
この単純なスニペットは、手動で行う方法を示しています。の値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
これを拡張メソッドにすることは大したことではありません。
効率はよくわかりませんが、この拡張方法でうまくいきます
public static BitArray ShiftRight(this BitArray instance)
{
return new BitArray(new bool[] { false }.Concat(instance.Cast<bool>().Take(instance.Length - 1)).ToArray());
}
System.Numerics.BigInteger は実際にビット シフトをサポートしています。
ラッパーとして自分でビット配列を再作成しますulong[]
; 64よりも小さい数でビットシフトを実装することは、そのように簡単なことであり、他の提案されたアプローチよりも時間がかからず、ホッキョクグマを殺すことが少なくなります。「終わりに落ちるビット」に注意することにより、それらを保持したい場合は、配列を拡張する必要があります(または、それらがゼロであり、存在しない要素が暗黙的にゼロを保持すると言う場合)。
頭のてっぺんから離れる最も簡単な方法は、BitArrayをBigIntまたはビット単位のシフトとバックをサポートする同様の構造に変換することです。さて、.Net 4に組み込まれているBigIntegerはシフトをサポートしていないと思いますが、Monoの実装のようにサポートしているものもあります。