手書きの場所でビットセットを使用すると、パフォーマンスの低下/向上はありますか?
実行時にビットセットを使用して以下をビルドする方法
- 2 から 5 までのすべてのビットをゼロにし
11110011
ます。
手書きの場所でビットセットを使用すると、パフォーマンスの低下/向上はありますか?
実行時にビットセットを使用して以下をビルドする方法
11110011
ます。黄金律:
時期尚早に最適化しないでください。
Bitset は 99% のケースで十分に高速であり、一般的な概念であるため、読みやすく、実装エラーが発生しにくいという利点があります。あなたのコードが明らかに高速化を必要とするだろうと単純に思い込まないでください。bitset を使用してコードを記述し、アプリケーションをプロファイリングして、次のことを確認します。
80 対 20 の法則によれば、他のコードを高速化することで、はるかに大きな利益が得られる可能性があります。そして、ちょっと、ビットをいじる速度を改善する必要があることが判明した場合は、少なくとも、ソリューションがデフォルトよりも実際に高速であることを示すために使用する適切なベースライン数値がいくつかあります(とにかく必要です)パフォーマンスを最適化したい場合)。
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;
}
上記のような単純な例では、ビットセットを使用するよりも手でコーディングした適切なソリューションの方が高速ですが、どちらの場合もパフォーマンスの違いはわずかです。