Sparkyの答えはこの問題を解決するための1つの標準的な方法ですが、私のコメントにも書いているように、オーバーフローのリスクがあります。これはより広い型を使用することで解決できますが、long long
s を分割したい場合はどうでしょうか?
Nathan Ernstの答えは1つの解決策を提供しますが、関数呼び出し、変数宣言、および条件を含みます。最適化が難しいため、OPsコードより短くなく、おそらくさらに遅くなります。
私の解決策はこれです:
q = (x % y) ? x / y + 1 : x / y;
モジュロと除算はプロセッサ上で同じ命令を使用して実行されるため、コンパイラはそれらが同等であると認識できるため、OPsコードよりもわずかに高速になります。少なくともgcc 4.4.1は、x86で-O2フラグを使用してこの最適化を実行します。
理論的には、コンパイラはNathan Ernstのコードで関数呼び出しをインライン化して同じことを出力する可能性がありますが、gccはテストしたときにそれを行いませんでした。これは、コンパイルされたコードを標準ライブラリの単一バージョンに結び付けるためと考えられます。
最後に、非常にタイトなループにあり、すべてのデータがレジスタまたはL1キャッシュにある場合を除いて、最近のマシンではこれは問題になりません。それ以外の場合、これらのソリューションはすべて同じように高速になりますが、Nathan Ernstの場合は例外ですが、関数をメインメモリからフェッチする必要がある場合は、速度が大幅に低下する可能性があります。
q = x/y + (x % y != 0);
十分です