4

重複の可能性:
負の数を処理する C/C++/Obj-C でモジュロ (%) 演算子をコーディングする方法

私が理解していることから(負の値を持つモジュロ演算子とモジュロ演算を参照 CおよびC++には「剰余」演算子a % bがありますが、LHSが負の場合に実際にモジュラー演算を行う演算子はありません。

いくつかの言語にはそのような機能があります。C/C++ で効率的な関数を構築することは可能ですか (または i686/x64 CPU で効率的な方法はありませんか)?

現在、LHS 全体が非負であることをかなり確信で​​きるように(n * b + a) % bwhere is pick を使用していますが、必然的にコードが変更され、バグが発生することもあります。n

a + b % b = a % b注: 明確でない場合、剰余算術とは、すべての整数aとすべての正の整数に対してそのような演算子を意味しますb

4

2 に答える 2

14

これを行う簡単な方法はありませんが、2行のソリューションを作成し、乗算と決定を行わない方が効率的ですn

inline int modulo(int a, int b) {
  const int result = a % b;
  return result >= 0 ? result : result + b;
}

また、負の数に対しても正しく作業する必要がある場合はb、先頭に次を追加します。

          if(b < 0) return modulo(-a, -b);
于 2012-08-23T10:29:19.873 に答える
2

上記のような関数をお勧めしますが、inline int modulo(int a, int b) {}(演算子が C++ に存在するかのように) を使用します。%個人的には、負の数はあまり使用しませんが、コードで負の数を使用しない場合は常に保持する必要があると考えています。

于 2012-08-23T10:32:59.207 に答える