0

循環配列のように振る舞うべきものに対するインデックスカウンターを保持しています。サイズを強制的に 2 のべき乗にsize_t MASK = size_ - 1するため、次のようにトラバースするときにモジュラスを置き換えるために使用します。

index_ = (++index_) & MASK;

しかし、問題は、私の状況では、次回ここで配布したインデックスを再利用できることに気付くことがあります。その場合、次のようなものがあります。

if (canReuseLastUsedIndex())
    --index_;

index_しかし、これはラップアラウンドしないため、最後のディッシュアウトがゼロのときにクラッシュしますsize_(つまりMASK+1)。これを実現するためのbitopの方法はありますか?それとも非常に速いものですか?(つまり、できれば言う必要はありません: if (index_) --index_; else index_ = size_)

4

2 に答える 2

6

同じことを実行してビットマスクすることができます:

index_ = (index_ - 1) & MASK;

これが機能するのは、符号なしアンダーフローが C および C++ で明確に定義されているためです。

このコード行は未定義の動作であることに注意してください:

index_ = (++index_) & MASK;

変数index_をシーケンス ポイント間で (プレインクリメントと代入の両方で) 2 回以上変更しているためです。

于 2012-11-09T19:10:26.700 に答える
1

あなたはすでにそれをやっています。MASK足し算で行ったのと同じように適用するだけです。

index_ = (index_ - 1) & MASK;
于 2012-11-09T19:10:40.163 に答える