C / C ++中的实模运算符?

时间:2012-08-23 10:20:45

标签: c++ c modulo

  

可能重复:
  How to code a modulo (%) operator in C/C++/Obj-C that handles negative numbers

据我所知(见Modulo operator with negative valuesModulo operation)C& C ++有一个“余数”运算符a % b,但是当LHS为负时,没有实际执行模运算的运算符。

有几种语言确实有这样的功能。是否有可能在C / C ++中构建一个高效的函数(或者在i686 / x64 CPU上没有有效的方法)?

目前我使用(n * b + a) % b选择n,这样我就可以确定整个LHS是非负面的,但不可避免地会改变代码并且有时会出现错误。

注意:如果不清楚,通过模运算我的意思是一个运算符,a + b % b = a % b表示所有整数a和所有正整数b

2 个答案:

答案 0 :(得分:11)

没有简单的方法可以做到这一点,但如果你创建一个双线解决方案,并且使用乘法加上确定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);

答案 1 :(得分:2)

我建议使用类似上面的函数,但是使用inline int modulo(int a, int b) {}(就像运算符存在于C ++中一样)。我个人经常不使用负数,但仍然认为只要代码不使用负数,就应该保留%