C++ C++;相当于Java';s Math.floorMod()?
在Java中,我们有两种不同的模(和remiander)操作,C++ C++;相当于Java';s Math.floorMod()?,c++,modulus,C++,Modulus,在Java中,我们有两种不同的模(和remiander)操作,%和Math.floorMod()。不同之处在于映射目标的区域,它可以取决于第一个操作数的符号,也可以取决于第二个操作数的符号 在C++中是否有一个等价的(快速)操作,其效果与数学>? 我目前采用以下方法(出于性能原因,它甚至不完全等同于Math.floorMod()): inlineintfloor\u mod(intx,inty){ x%=y; if(x
%
和Math.floorMod()
。不同之处在于映射目标的区域,它可以取决于第一个操作数的符号,也可以取决于第二个操作数的符号
在C++中是否有一个等价的(快速)操作,其效果与<代码>数学>? 我目前采用以下方法(出于性能原因,它甚至不完全等同于
Math.floorMod()
):
inlineintfloor\u mod(intx,inty){
x%=y;
if(x<0){
x+=y;
}
返回x;
}
我认为可能有一个内在的或类似的东西,在某些CPU上只编译成一条指令。嗯
恐怕你得自己做一个。一行程序是一个自定义的floorModulo
,但是如果您希望使用无符号int&
作为除数,那么一行程序测试可能会更快(更可读)
#包括
int myCustomModulo(常量int&a、常量int&b);
int main()
{
标准::cout
cmath头文件中的余数()函数类似于math.floorMod()
对于整数运算
#include <cmath>
remainder(dividend, divisor)
虽然我不知道有任何内在函数能够执行这样的操作,但我想修改asker的实现,以便更好地模拟Java函数Math.floorMod(股息、除数)
constexpr int floor\u mod(整数被除数,整数除数)
{
返回[除数,余数=股息%除数]{
返回余数&(余数<0!=除数<0)
?余数+除数
:余数;
} ();
}
此函数针对一些琐碎的输入进行测试
额外操作产生的开销似乎小于额外模所需的开销(例如,参见那些快速基准测试:或)。如果(y<0)不应该是if吗如果说x
是-101
,y
是100
,x%=y
的结果与x=x%y
相同,那么x
将是-101%100
,这等于-1
(在C++)。因此,您需要检查x
是否为负数,以便在必要时对其进行补码。@BlayerBond好吧,版本似乎与java函数等效,但不是太多。我感到困惑,因为我不理解您的上一条注释,认为我错了。同时,我重写了它,以确保它具有相同的输出。谢谢您的帮助关于signed int
s的情况下应该在y
上进行额外的if测试,您的评论是对的。我重写了main
以进行检查,并得到了更清晰的结果。
| 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 |
#include <cmath>
remainder(dividend, divisor)
int floor_mod(int x, int y)
{
return x-(x/y)*y ;
}
constexpr int floor_mod(int dividend, int divisor)
{
return [divisor, remainder = dividend % divisor] {
return remainder && (remainder < 0 != divisor < 0)
? remainder + divisor
: remainder;
} ();
}