gpt4 book ai didi

C++ 相当于 Java 的 Math.floorMod()?

转载 作者:行者123 更新时间:2023-12-01 14:18:14 27 4
gpt4 key购买 nike

在 Java 中,我们有两种不同的模(和余数)运算,%Math.floorMod() .区别在于映射目标的区域,这可以取决于第一个操作数的符号或第二个操作数的符号。 This page explains the difference nicely.
C++ 中是否有与 Math.floorMod() 效果相同的等效(快速)操作? ?
我目前采用以下方法(出于性能原因,它甚至不完全等同于 Math.floorMod() ):

inline int floor_mod(int x, int y) {
x %= y;

if (x < 0) {
x += y;
}

return x;
}
我认为可能有一个内在的或类似的东西在某些 CPU 上只编译为 1 条指令。

最佳答案

好...
恐怕你得自己做一个。单线是定制的 floorModulo ,但是如果您期待 unsigned int&,一个 if-test 可能会更快(并且更具可读性)作为除数。

#include <iostream>

int myCustomModulo(const int& a, const int& b);

int main()
{
std::cout
<< "| mod & +divisor | mod & -divisor |\n"
<< "| :------------- | -------------- |\n"
;
int b{ 3 };
for (int a{ -5 }; a < 0; ++a)
std::cout
<< "| " << a << " mod " << b << " = " << myCustomModulo(a, b) << " "
<< "| " << a << " mod " << -b << " = " << myCustomModulo(a, -b) << " |"
<< std::endl
;
for (int a{ 0 }; a < 6; ++a)
std::cout
<< "| " << a << " mod " << b << " = " << myCustomModulo(a, b) << " "
<< "| " << a << " mod " << -b << " = " << myCustomModulo(a, -b) << " |"
<< std::endl
;
}

int myCustomModulo(const int& a, const int& b)
{
return (a % b + b) % b;
}
输出:
| mod & +divisor | mod & -divisor |
| :------------- | -------------- |
| -5 mod 3 = 1 | -5 mod -3 = -2 |
| -4 mod 3 = 2 | -4 mod -3 = -1 |
| -3 mod 3 = 0 | -3 mod -3 = 0 |
| -2 mod 3 = 1 | -2 mod -3 = -2 |
| -1 mod 3 = 2 | -1 mod -3 = -1 |
| 0 mod 3 = 0 | 0 mod -3 = 0 |
| 1 mod 3 = 1 | 1 mod -3 = -2 |
| 2 mod 3 = 2 | 2 mod -3 = -1 |
| 3 mod 3 = 0 | 3 mod -3 = 0 |
| 4 mod 3 = 1 | 4 mod -3 = -2 |
| 5 mod 3 = 2 | 5 mod -3 = -1 |
来自您的链接的正确结果:
| mod & +divisor | mod & -divisor |
| :------------- | :--------------|
| -5 mod 3 = 1 | -5 mod -3 = -2 |
| -4 mod 3 = 2 | -4 mod -3 = -1 |
| -3 mod 3 = 0 | -3 mod -3 = 0 |
| -2 mod 3 = 1 | -2 mod -3 = -2 |
| -1 mod 3 = 2 | -1 mod -3 = -1 |
| 0 mod 3 = 0 | 0 mod -3 = 0 |
| 1 mod 3 = 1 | 1 mod -3 = -2 |
| 2 mod 3 = 2 | 2 mod -3 = -1 |
| 3 mod 3 = 0 | 3 mod -3 = 0 |
| 4 mod 3 = 1 | 4 mod -3 = -2 |
| 5 mod 3 = 2 | 5 mod -3 = -1 |

关于C++ 相当于 Java 的 Math.floorMod()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62916620/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com