是否可以在 C++ 中的单个操作中同时获得除法的模数和商数?
Is it possible to get both the modulus and quotient of division in a single operation in C++?
我听说当处理器执行 / 或 % 时,它会执行相同的操作,但一种方式是 returns 商,另一种方式是余数。
是否可以在一次操作中同时获得两者?也许如果我输入一段汇编代码(我从未做过)?
Is it possible to get both in a single operation?
不,C++ 中没有这样的运算符。标准库中有一个函数可以执行这两个操作:std::div
但这并不重要。无论您在 C++ 中有一个还是两个操作并不意味着 cpu 必须执行那么多操作。半个体面的优化器将能够将两个操作转换为一条指令(假设目标 CPU 可以实现)。
是的,编译器会为您完成。只需使用除法后跟具有相同操作数的余数即可。
https://godbolt.org/z/oK4f4s
void div(int n, int d, int *q, int *r)
{
*q = n / d;
*r = n % d;
}
div(int, int, int*, int*):
mov eax, edi
mov r8, rdx
cdq
idiv esi
mov DWORD PTR [r8], eax
mov DWORD PTR [rcx], edx
ret
是的。这就是函数 std::remquo
and std::div
的作用。
我听说当处理器执行 / 或 % 时,它会执行相同的操作,但一种方式是 returns 商,另一种方式是余数。
是否可以在一次操作中同时获得两者?也许如果我输入一段汇编代码(我从未做过)?
Is it possible to get both in a single operation?
不,C++ 中没有这样的运算符。标准库中有一个函数可以执行这两个操作:std::div
但这并不重要。无论您在 C++ 中有一个还是两个操作并不意味着 cpu 必须执行那么多操作。半个体面的优化器将能够将两个操作转换为一条指令(假设目标 CPU 可以实现)。
是的,编译器会为您完成。只需使用除法后跟具有相同操作数的余数即可。
https://godbolt.org/z/oK4f4s
void div(int n, int d, int *q, int *r)
{
*q = n / d;
*r = n % d;
}
div(int, int, int*, int*):
mov eax, edi
mov r8, rdx
cdq
idiv esi
mov DWORD PTR [r8], eax
mov DWORD PTR [rcx], edx
ret
是的。这就是函数 std::remquo
and std::div
的作用。