1

個々のビットを頻繁にリセットしたい大きなビットセットがあります。どちらの方法が速いですか?

a)bitset[word_index] ^= 1 << bit_index

また

b)bitset[word_index] &= ~(1 << bit_index)

アプリケーションはデスクトップ用です(それが役割を果たす場合)。

4

3 に答える 3

5

彼らは同じことをしません。

オプション a は、指定されたビットを反転します。オプション b はそれをクリアします。実際にあなたの意図を反映しているものを選んでください。ビットをクリアしたいが、それが常に設定されることがわかっている場合は、「ビットをクリアする」部分をより明確に示すオプション b を使用します。

あなたがこれを「頻繁に」したいと言うとき、どれくらいの頻度ですか?これがアプリケーションのボトルネックであることを示唆する証拠はありますか? そうでない場合、最も読みやすい方法ではなく、最速の方法に関心があるのはなぜですか?

于 2010-02-09T14:16:54.553 に答える
2

位置 N のビットをクリアしたい場合は、位置 N に 0 を、それ以外の場所に 1 を指定してマスクを設定し、次のようにビットごとの AND 演算子を使用する必要があります。

a &= ~(1 << N);

N の位置にビットを設定する場合は、N の位置に 1 を、その他の場所に 0 を指定してマスクを設定し、次のようにビットごとの OR 演算子を使用する必要があります。

a |= (1 << N);

N の位置でビットを TOGGLE したい場合は、N の位置に 1 を、その他の場所に 0 を指定してマスクを設定し、次のようにビットごとの XOR 演算子を使用する必要があります。

a ^= (1 << N);

同じ理由を適用して、一度に複数のビットに影響を与えることができます。通常は、個々のビットマスクを一緒に OR します。たとえば、 a の 3 番目、5 番目、および 9 番目のビットをクリアするには、次のようにします。

a &= ~( (1 << 3) | (1 << 5) | (1 << 9) );

ただ言う代わりに、なぜそのようにするのですか:

a &= 0x0DD7;

2つの理由 -

(1) 通常、3、5、および 9 はリテラルではなく、読みやすくするために定数を定義します。(2)コンパイラはコンパイル時にそれをそれに変換します(定数を使用している場合)。コードを読みにくくする必要はありません。

于 2010-02-09T14:29:53.897 に答える
1

コードが意図したとおりに正しく動作すると仮定する: これは、マイクロ最適化と呼ばれます。

実質的な違いはありそうにありません。優れた最適化コンパイラは、どちらの方法でも高速なコードを生成します。

特定の状況でのベンチマークを提案します。(また、単体テストを作成することをお勧めします)

于 2010-02-09T14:17:10.137 に答える