コードを慎重にプロファイリングして、モジュロ演算子が内側ループの主なコストであることが判明した場合は、最適化が役立ちます。あなたは(32ビット値のための)算術左シフトを使用して整数の符号を決定するためのトリックと既にお馴染みかもしれない:
sign = (x >> 31) | 1;
これは単語を横切って符号ビットを拡張するので、負の値が得-1正値0を設定します。
モジュロ未満の量だけ値をインクリメントする場合、この同じトリックを使用して結果をラップすることができます。
val += inc;
val -= modulo & (static_cast<int32_t>(((modulo - 1) - val)) >> 31);
また、減少している場合以下モジュロ以上の値によって、関連するコードは次のとおりです。
int32_t signedVal = static_cast<int32_t>(val - dec);
val = signedVal + (modulo & (signedVal >> 31));
私はのuint32_tに渡したので、私はstatic_castを演算子を追加しましたが、あなたは彼らが必要見つけない場合があります。
これは単純な%演算子とは対照的ですか?それはあなたのコンパイラとCPUアーキテクチャに依存します。 VS2012でコンパイルするとi3プロセッサでシンプルなループが60%高速に実行されていましたが、Raspberry PiのARM11チップではGCCでコンパイルすると20%の改善しか得られませんでした。
"このコードは、%演算子と比較してwhileループが十分に効率的ですか?"あなたは、あなたがプログラムを使用していることを教えてください。それは遅い感じですか?あなたは気づくことができますか?プロファイリングして、これがまったく遅いことを発見しましたか? – GManNickG
サイズによって異なります。 'b = 1000000000'と' c = 3'の場合。それはしばらく時間がかかります... – Mysticial
ターゲットCPUとコンパイラを教えてください。それがなければ、どのアプローチも比較することは不可能です。 – fghj