可能重复:
How to code a modulo (%) operator in C/C++/Obj-C that handles negative numbers
据我所知(见Modulo operator with negative values和Modulo operation)C& C ++有一个“余数”运算符a % b
,但是当LHS为负时,没有实际执行模运算的运算符。
有几种语言确实有这样的功能。是否有可能在C / C ++中构建一个高效的函数(或者在i686 / x64 CPU上没有有效的方法)?
目前我使用(n * b + a) % b
选择n
,这样我就可以确定整个LHS是非负面的,但不可避免地会改变代码并且有时会出现错误。
注意:如果不清楚,通过模运算我的意思是一个运算符,a + b % b = a % b
表示所有整数a
和所有正整数b
。
答案 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 ++中一样)。我个人经常不使用负数,但仍然认为只要代码不使用负数,就应该保留%
。