我只是想知道,如果我想将a除以b,并且对结果c和余数感兴趣(例如说我有秒数并希望将其分成几分钟和几秒),那么最好的方法是什么去吧?
可不可能是
int c = (int)a / b;
int d = a % b;
Run Code Online (Sandbox Code Playgroud)
要么
int c = (int)a / b;
int d = a - b * c;
Run Code Online (Sandbox Code Playgroud)
要么
double tmp = a / b;
int c = (int)tmp;
int d = (int)(0.5+(tmp-c)*b);
Run Code Online (Sandbox Code Playgroud)
要么
也许有一个神奇的功能同时给出一个?
cni*_*tar 87
在x86上,余数是除法本身的副产品,因此任何半合适的编译器都应该能够使用它(而不是div
再次执行).这可能也是在其他架构上完成的.
说明:
DIV
src注意:无符号除法.将累加器(AX)除以"src".如果除数是字节值,则将结果放入AL ,将余数放入AH.如果除数是字值,则DX:AX除以"src",结果存储在AX中,余数存储在DX中.
int c = (int)a / b;
int d = a % b; /* Likely uses the result of the division. */
Run Code Online (Sandbox Code Playgroud)
pez*_*ode 71
std::div
返回包含结果和余数的结构.
Pet*_*der 25
至少在x86上,g ++ 4.6.1只使用IDIVL并从该单个指令中获取.
C++代码:
void foo(int a, int b, int* c, int* d)
{
*c = a / b;
*d = a % b;
}
Run Code Online (Sandbox Code Playgroud)
x86代码:
__Z3fooiiPiS_:
LFB4:
movq %rdx, %r8
movl %edi, %edx
movl %edi, %eax
sarl $31, %edx
idivl %esi
movl %eax, (%r8)
movl %edx, (%rcx)
ret
Run Code Online (Sandbox Code Playgroud)
示例代码测试div()和组合分区和mod.我使用gcc -O3编译了这些,我不得不添加对doNothing的调用来阻止编译器优化所有内容(对于除法+ mod解决方案,输出将为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);
}
Run Code Online (Sandbox Code Playgroud)
产出: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);
}
Run Code Online (Sandbox Code Playgroud)
产出:25
除了前面提到的std :: div系列函数之外,还有std :: remquo函数系列,返回rem -ainder并通过传入指针获取quo -tient.
[编辑:]看起来std :: remquo毕竟不会真正返回商数.
归档时间: |
|
查看次数: |
212043 次 |
最近记录: |