2012-08-23 111 views
4

可能重复:
How to code a modulo (%) operator in C/C++/Obj-C that handles negative numbersC/C++中的真模运算符?

从我的理解(见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

+1

http://stackoverflow.com/questions/4003232/how-to-code-a-modulo-operator-in-c-c-obj-c-that-handles-negative-numbers – Andrey

+0

你在使用整数吗?否则,我会推荐'std :: fmod'。 – Ruud

+0

整数,是的。主要是作为数组索引。 – dhardy

回答

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); 
+0

“没有简单的方法去做”......真的吗?你的解决方案对我来说很简单。 +1 – JeremyP

+0

哇,这很快!我会在稍后测试性能,但除非跳跃很重要,否则可能不会比我使用ATM更慢。 – dhardy

2

我建议像上面的功能,但使用inline int modulo(int a, int b) {}(就像如果运算符存在于C++中)。 Personnally我不经常使用负数,并且仍然认为只要代码不使用负数,就应该保留%

+0

我向答案添加了内联建议。谢谢。 – Lorlin

+0

问题是代码被改变了,曾经非负面的东西有时最终被否定。我可能会在某些地方使用%和断言(尽管我并不关心调试模式的性能)。 – dhardy

+0

@dhardy你的意思是代码被改变了吗?我谈论的情况是例如数组索引(从不<0)或增量计数器。 – maxbc