【发布时间】:2019-08-14 08:01:07
【问题描述】:
我有2个号码A和B。我想找到C = A - (A % B),但是有一些问题。首先,如果C 和D = A / B 应该具有相同的奇偶校验((偶数和偶数)或(奇数和奇数)),否则C 应该递增(++C)。第二个问题是我经常做这个计算,所以我希望它的成本尽可能小。现在我的解决方案是这样的:
uint32_t D = A / B;
C = D * B;
if ((C ^ D) & 0x1) ++C;
有没有更好的方法来做到这一点?由于编译器优化,(C % 2) != (D % 2) 可能更快,但我无法证明这一点。我也想知道是否可以使用某些特定的 intel 函数(寄存器)来完成。
【问题讨论】:
-
(C ^ D) & 0x1将是0或1,您可以无条件地将其添加到C。 -
但是在开始进行此类微优化之前,请先启用优化并进行 measure 和 profile 构建,如果需要,请检查生成的程序集。也许这不是您真正认为的那样的瓶颈?
-
地板(A / B)* B
标签: c++ math x86 micro-optimization integer-division