C ++最好的方法来获得整数除法和余数

我只是想知道,如果我想分割一个B,并且对结果C和其余部分都感兴趣(比如说我有秒数,并且想把它们分成几分钟和几秒钟),那么最好的方法是什么去做吧?

可不可能是

int c = (int)a / b; int d = a % b; 

要么

 int c = (int)a / b; int d = a - b * c; 

要么

 double tmp = a / b; int c = (int)tmp; int d = (int)(0.5+(tmp-c)*b); 

要么

也许有一个神奇的function,同时给予一个?

在x86上,其余部分是该部门自身的副产品,所以任何半面体编译器都应该能够使用它(而不是再次执行div )。 这可能也是在其他架构上完成的。

指令: DIV src

注意:未签名的部门。 用“src”除累加器(AX)。 如果除数是一个字节值,结果将被置于AL ,其余的置为AH 。 如果除数是字值,则DX:AX除以“src”,结果存储在AX中,余数存储在DX中

 int c = (int)a / b; int d = a % b; /* Likely uses the result of the division. */ 

std::div返回结果和余数的结构。

至less在x86上,g ++ 4.6.1只是使用IDIVL,并从这个单一的指令中获取。

C ++代码:

 void foo(int a, int b, int* c, int* d) { *c = a / b; *d = a % b; } 

x86代码:

 __Z3fooiiPiS_: LFB4: movq %rdx, %r8 movl %edi, %edx movl %edi, %eax sarl $31, %edx idivl %esi movl %eax, (%r8) movl %edx, (%rcx) ret 

示例代码testingdiv()和组合部门和国防部。 我用gcc -O3编译了这些,我不得不添加调用doNothing来停止编译器优化所有内容(输出对于分区+ mod解决scheme将是0)。

带上一粒盐吧:

 #include <stdio.h> #include <sys/time.h> #include <stdlib.h> extern doNothing(int,int); // Empty function in another compilation unit int main() { int i; struct timeval timeval; struct timeval timeval2; div_t result; gettimeofday(&timeval,NULL); for (i = 0; i < 1000; ++i) { result = div(i,3); doNothing(result.quot,result.rem); } gettimeofday(&timeval2,NULL); printf("%d",timeval2.tv_usec - timeval.tv_usec); } 

产出:150

 #include <stdio.h> #include <sys/time.h> #include <stdlib.h> extern doNothing(int,int); // Empty function in another compilation unit int main() { int i; struct timeval timeval; struct timeval timeval2; int dividend; int rem; gettimeofday(&timeval,NULL); for (i = 0; i < 1000; ++i) { dividend = i / 3; rem = i % 3; doNothing(dividend,rem); } gettimeofday(&timeval2,NULL); printf("%d",timeval2.tv_usec - timeval.tv_usec); } 

产出:25

除了前面提到的std :: div函数家族之外,还有std :: remquo系列函数,通过传入的指针返回rem -ainder并获取当前值。

[编辑:]它看起来像std :: remquo 并不真正返回商 。

除此之外,最好的解决办法就是清楚地expression你的意图。 所以:

 int totalSeconds = 453; int minutes = totalSeconds / 60; int remainingSeconds = totalSeconds % 60; 

可能是你提出的三个选项中最好的。 正如在其他答案中指出的那样, div方法会一次为您计算两个值。

在32位intel平台上,你不能相信g ++ 4.6.3和64位整数。 a / b通过调用divdi3来计算,%b通过调用moddi3来计算。 我甚至可以拿出一个例子来计算这些调用a / b和ab *(a / b)。 所以我用c = a / b和ab * c。

div方法调用了一个计算div结构的函数,但是一个函数调用在硬件支持整数types(即64位intel / amd平台上的64位整数)的平台上效率不高。

你可以使用一个模数来得到余数。 虽然@ cnicutar的答案似乎更清洁/更直接。