2

C#.NET を使用してビットを操作する基本的なスキルを取得しようとしています。昨日、ビット操作が必要な単純な問題の例を投稿しました。これにより、bitwise operators.NET 抽象化を使用または使用するという 2 つの主なアプローチがBitArrayあることがわかりました。 .NET以外のビットBitArrayと、それらの詳細情報がある場合の検索方法)。

bitwise operators作業が速くなることは理解していますが、使用する方がBitArrayはるかに簡単ですが、私が本当に避けようとしているのは、悪い習慣を学ぶことです. 私の個人的な好みは .NET の抽象化ですが、実際のプログラムで実際に学習して使用する方が良いものを知りたいです。それについて考えると、.NET の抽象化はそれほど悪くないと思いたくなります。結局のところ、そこにいる理由が必要であり、おそらく初心者であるため、抽象化を学び、後で低レベルの操作でスキルを向上させる方が自然です。 、しかし、これは単なるランダムな考えです。

4

3 に答える 3

4

それは本当にあなたがそれで何をしているかに依存します. オーバーヘッドがはるかに少ないため、速度がより重要な場合はビット演算を使用すると思います。それ以外の場合は、BitArray で問題ありません。関連する主なオーバーヘッドは、関数呼び出しと、実行できる「トリック」の制限です。

たとえば、ビット 0、3、または 4 が値に設定されている場合に何かをしたい場合:

if((value & 0b11001)>0) //not sure this is valid syntax, but you get the idea
{
   //do stuff
}

整数はネイティブの CLR 型であるため、ほぼ直接、わずか 3 つのネイティブ オペコード、、、、に変換されmovますandcmp

BitArray に関しては、私が見る最も効率的な方法は次のとおりです。

if(value[0] || value[3] || value[4])
{
  //...
}

ここで (JIT ではないと仮定して)、これは最大 3 つの関数呼び出しに相当し、複雑さは軽度です。BitArray のバッキング整数 (私が推測) からビット値を取得する最も簡単な方法は次のようになります。

bool GetBit(int which)
{
  return value & (1 << which)>0;
}

これは基本的に、1 ビットだけで約 2 倍遅くなることを意味します。この非常に単純なケースでは、3 ビットをチェックしているため、約 6 倍遅くなります。

また、BitArray の場合、コピーはネイティブの CLR 型ではないため、コストが高くなる可能性があります。このオーバーヘッドの大部分は JIT で取り除かれているのではないかと思いますが、特にコンパクトなフレームワークをターゲットにしている場合は、考慮すべきことがあります。

基本的に、BitArray に対して複雑なビット単位の操作を行う必要がない場合にのみ、BitArray を使用してください。

注: 整数と BitArray の間で変換するハイブリッド アプローチを使用することもできますが、これにもかなりのオーバーヘッドが発生する可能性があります。

于 2012-09-13T15:43:21.187 に答える
3

実際のプログラムで実際に学び、使用するのにどちらが良いか知りたいです。

両方を学びましょう。それらを理解するのはそれほど難しくなく、一方が他方よりも優れているシナリオを想像することができます.

上記の@Marc Gravellに同意しますが、処理する必要がある膨大な数のビットがある場合にのみBitArrayの使用を考えます(速度はそれほど問題ではありません)が、最終的にその状況では、とにかく何か間違ったことをしている可能性があります。

于 2012-09-13T15:42:38.503 に答える
3

プログラミングするときは、常に次のことに注意してください。

「間接化の層が多すぎるという問題を除いて、間接化の層をもう 1 つ追加しても解決できない問題はありません」。-デビッド・ウィーラー (パラ)

BitArray を使用することで、ビットの管理方法と各ビットの値の生成および操作方法の詳細を抽象化する間接レイヤーを追加します。これは通常、良いことであり、推奨されます。よりクリーンでエレガントで読みやすいコードを作成します。

しかし、BitArray では実行できない (または実行が非常に困難な) 複雑なことを行う必要がある場合はどうなるでしょうか。その時点で、あなたのデザインは「過度に抽象的」です。抽象化のレベルは、やりたいことを実行するのを妨げます。これは、より少ない抽象化でリファクタリングするためのシグナルです。この場合、より注意と理解が必要ですが、基本的にビットのセットに対して可能なことは何でも行うビット演算子を使用します。

つまり、BitArray を使用すること自体が問題になるまで、BitArray を使用して問題を解決してください。BitArray なしで何をしようとしているのか心配する必要はありません。それがいつ必要になるかを心配することができます。ビット単位の演算子の使用方法、またはそれらが存在することを忘れないでください。

于 2012-09-13T15:43:17.630 に答える