.net 区别于;Math.DivRem“;操作员呢?

.net 区别于;Math.DivRem“;操作员呢?,.net,math,operators,division,.net,Math,Operators,Division,System.Math.DivRem()与%运算符之间的区别是什么?%给出除法的余数并完全丢弃商,而DivRem()计算并返回商和余数 如果您只关心两个整数之间除法的余数,请使用%: int remainder = 10 % 3; Console.WriteLine(remainder); // 1 如果需要知道10除以3的次数,然后才能得到1的余数,请使用DivRem(),它返回商并将余数存储在out参数中: int quotient, remainder; quotient = Math.

System.Math.DivRem()
%
运算符之间的区别是什么?

%
给出除法的余数并完全丢弃商,而
DivRem()
计算并返回商和余数

如果您只关心两个整数之间除法的余数,请使用
%

int remainder = 10 % 3;
Console.WriteLine(remainder); // 1
如果需要知道10除以3的次数,然后才能得到1的余数,请使用
DivRem()
,它返回商并将余数存储在out参数中:

int quotient, remainder;
quotient = Math.DivRem(10, 3, out remainder);
Console.WriteLine(quotient);  // 3
Console.WriteLine(remainder); // 1

这是一种优化。一些处理器能够同时计算这两个值。其他处理器不能在硬件上划分(并且必须使用非常慢的软件例程)

在任何一种情况下(除非你有一个智能编译器),你都可以计算相同的除法两次。由于在任何处理器上(即使在硬件中实现时),除法都不会很快,因此使用Math.DivRem会给JIT一个很好的“提示”,让它只计算一次值

iirc Mono没有实现这种优化,我甚至不确定MS是否实现了。

这可能是一种优化,但不幸的是,它产生的IL与division和mod操作相同

在典型的体系结构(x86和friends)上,这两者可以通过一个操作获得,但是.NETJIT似乎没有优化这一点(在我的测试中)

因此,以下两个是等效的:

quotient = Math.DivRem(10, 3, out remainder);
VS:

但后者更具可读性

请注意,在x86和x64上,此选项速度更快:

quotient  = 10 / 3;
remainder = 10 - (3*quotient);

希望有一天JIT会改进,将两个操作优化为一个操作,因为它很简单。

如果您只需要两个整数的商,您可以简单地使用
/
运算符而不是
%
整数商=10/3Dim商,即整数=10\3
。实际上,我可能使用Decimal.Divide(),因为我不希望返回一个完整的整数。@mbrownnyc re“我不希望返回一个完整的整数”:在除法之前,将其中一个或两个值转换为非整数类型:
double result=a/(double)b这是两个整数除法的非整数结果。感谢您解释底层过程。我用c#编写代码,显然使用的是.NET框架;但这是非常好的扩展。嘿我刚读完这篇:
quotient  = 10 / 3;
remainder = 10 - (3*quotient);