最近、次のような表現を使い始めました。
res += (i + n / i) * !(n % i);
私が想定している場合、これ!(n % i)
は常に1または0の値になるため、次のような長いifステートメントを記述する代わりに、直接計算に使用できます。
if(!(n % i))
res += (i + n / i);
ご参考までに、これらの行は、数値の適切な除数の合計を計算するために作成した関数から取得されていますn
。
unsigned int sum_of_divisors(unsigned int n)
{
unsigned int res = 1;
unsigned int i;
for(i = 2; i < sqrt(n); ++i)
res += (i + n / i) * !(n % i);
res += i * (i * i == n);
return res;
}
私の質問は、このコードは私が意図したとおりに動作することが保証されているかどうかです。これによるパフォーマンスへのおおよその影響は何ですか(乗算と条件付きジャンプ)?必要に応じて、コンパイラはとにかくそれを行いますか?
編集:私は実際のコードのパフォーマンスについて特に心配していないことに注意してください。私は、純粋な専門家の関心から、2つのうちどちらがより優れたパフォーマンスを発揮するのか、そしてその理由、そしてコンパイラーがそれぞれのケースをどのように処理するのかを知りたいと思います。
私がそのように書いた理由については、それは私の脳でうまく機能します:)
説明するのは難しいですが、少なくとも場合によっては、三項演算子やifステートメントの代わりに1または0を乗算する方が良い感じがします。
ありがとう、アンディ