2011-02-06 1 views
1

私は、符号なし64ビット除算のために商と余りを必要とする関数を持っています。 lldivとlldiv_tのように見えますが、intではなくlong long intが署名されています。署名のないバージョンはありますか?そうでない場合、これを処理する最良の方法は何ですか?Cのlldivの符号なしバージョンですか?

速度は重要です(通常は何十億もの演算)が、コンパイラがこれを適切に処理できるほどスマートになる可能性があります - gcc 4.3.3を使用しています。

答えて

4

除算演算子と剰余演算子を使用してください。どんな普通のコンパイラでも、divldiv、またはlldivへの呼び出しよりも、最適化の方がはるかに優れています。

+1

+1。 FYI、GCCは通常long long/unsigned long longのディビジョンをlibgccへの呼び出しに変換します。これは通常はシステム(またはアーキテクチャ)を対象としています。 /と%は、-O [123]と一緒に行く方法です(あなたのコードもきれいにします)。 –

+0

@Matthew:注意しておいて、asmで書かれたlibgccから独自のバージョンの関数を定義することで、パフォーマンスを大幅に向上させることができます。例えば、gccの '__udivdi3'は、分子の上位ワードが分母よりも小さい64/32→32除算が単一の' div'命令であるという事実を絶対に使用しません。これを覚えておけば、ほとんどの現実世界の呼び出しを '__udivdi3'に置き換えることができます。もちろん、gccはこの最適化を*できる前に '__udivdi3'を呼び出す前に行うべきですが、gccはすべて知っています.... –

関連する問題