在C++中,是否可能通过单个操作同时获取除法的余数和商?

7

我听说当处理器进行 / 或 % 运算时,它将执行相同的操作,但一种方式返回商,另一种方式返回余数。

是否可能在单个操作中获得两者?也许如果我加入一小段汇编代码(我以前从未做过)?

3个回答

12

是的,编译器将为您执行此操作。只需使用相同操作数的除法后紧跟余数即可。
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

10

有没有可能在单个操作中同时实现这两个功能?

不,C++中没有这样的操作符。标准库中有一个函数可以同时完成这两个操作:std::div

但这并不重要。无论在C++中进行一个还是两个操作,CPU执行的指令数量都不会改变。只要优化器足够好,就能将这两个操作转换为单个指令(前提是目标CPU支持)。


2
(或者如果不是单个指令,则从商、被除数和除数中计算余数,不要重新执行任何不必要的工作。例如,ARM有一种乘法减法指令,专门用于在执行除法后计算余数。) - Peter Cordes

2

1
std::remquo --> 在商指针处保存“符号和至少最后三位”的值,而不是整个商。在范围缩减中与三角函数一起使用非常有用。 - chux - Reinstate Monica
@chux-ReinstateMonica -- 很有趣;我以前从没注意到。谢谢。 - Pete Becker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接