0

手書きの場所でビットセットを使用すると、パフォーマンスの低下/向上はありますか?

実行時にビットセットを使用して以下をビルドする方法

  • 2 から 5 までのすべてのビットをゼロにし11110011ます。
4

3 に答える 3

6

黄金律:

時期尚早に最適化しないでください。

Bitset は 99% のケースで十分に高速であり、一般的な概念であるため、読みやすく、実装エラーが発生しにくいという利点があります。あなたのコードが明らかに高速化を必要とするだろうと単純に思い込まないでください。bitset を使用してコードを記述し、アプリケーションをプロファイリングして、次のことを確認します。

  1. そのままでも十分に高速です。と
  2. 十分に高速でない場合、実際にほとんどの時間をビット操作に費やしているでしょうか?

80 対 20 の法則によれば、他のコードを高速化することで、はるかに大きな利益が得られる可能性があります。そして、ちょっと、ビットをいじる速度を改善する必要があることが判明した場合は、少なくとも、ソリューションがデフォルトよりも実際に高速であることを示すために使用する適切なベースライン数値がいくつかあります(とにかく必要です)パフォーマンスを最適化したい場合)。

于 2010-07-13T07:09:55.817 に答える
1

2 番目の質問に対する最も簡単な解決策は、別のビットセットを使用することです。

void makebitszero(bitset<8>& b) {
  // Everything but bits 3 and 4 (between 2 and 5).
  static const bitset<8> mask = ~bitset<8>(12);
  b &= mask;
}

mask与えられた 2 つのビット位置の式を考え出すには、少し計算が必要です。

[編集] わかりました、ここに数学があります。トリックは、それ(1UL << X) -1が一連​​のXものであるということです。例 3 => 00000111 したがって、(1<<5) - (1<<3) = 00011111 - 00000111 -1 + 1 = 00011000 (ビット 3 および 4)。したがって、コードでは:

template<int i, int j, int N> 
void makeBitsZero(bitset<N>& b) {
  // Everything from bit i up to but not including bit j (i < j)
  static const bitset<N> mask = ~bitset<N>(1UL<<j) - (1UL<<i));
  b &= mask;
}
于 2010-07-13T07:42:32.280 に答える
0

上記のような単純な例では、ビットセットを使用するよりも手でコーディングした適切なソリューションの方が高速ですが、どちらの場合もパフォーマンスの違いはわずかです。

于 2010-07-13T06:53:19.590 に答える