"Math.DivRem"和%运算符的区别是什么?

27

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

3个回答

34

%可以得到一个除法的余数并且不考虑商,而DivRem()则计算并返回商和余数

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

int remainder = 10 % 3;
Console.WriteLine(remainder); // 1
如果你需要知道10被3整除后余数为1的情况下除法运算发生了多少次,可以使用DivRem()函数,它返回商并将余数存储在一个输出参数中:

如果你需要知道10被3整除后余数为1的情况下除法运算发生了多少次,可以使用DivRem()函数,它返回商并将余数存储在一个输出参数中:

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

如果你只需要两个整数的商,你可以使用 / 运算符进行整数除法,而不是 %int quotient = 10 / 3; - BoltClock
2
在VB.NET中,整数除法运算符是\:Dim quotient As Integer = 10 \ 3 - BoltClock
谢谢大家。我可能会使用Decimal.Divide(),因为我不想返回一个整数。 - brandeded
1
@mbrownnyc 关于“我不想返回整数”的问题:在执行除法之前,将其中一个或两个值转换为非整数类型:double result = a / (double)b; 这是两个整数相除的非整数结果。 - ToolmakerSteve

11

这是一种优化方式。某些处理器能够同时计算两个值。而其他处理器不能在硬件上进行除法运算(必须使用非常缓慢的软件例程)。

无论哪种情况(除非您有一个智能编译器),否则您可能会计算相同的除法两次。由于除法在任何处理器上都不快(即使在硬件中实现),因此使用 Math.DivRem 给 JIT 提供了一个不错的“提示”,只计算一次这些值。

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


感谢您解释了这些底层过程。我正在使用C#编程,并且显然在使用.NET框架; 但是扩展知识总是好的。嘿...我刚刚读完了这篇文章:http://www.infoworld.com/print/169171 - brandeded

7

这本来可以是一个优化,但不幸的是它生成的IL代码与除法加上取模操作相同。

在典型的架构(如x86及其类似架构)中,两个操作可以通过单个操作来实现,但.NET JIT似乎没有对此进行优化(在我的测试中)。

因此,以下两种方式是等效的:

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

VS:

quotient  = 10 / 3;
remainder = 10 % 3;

除后者更易读外。

顺便说一下,在x86和x64架构上,这个丑陋的选项更快:

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

希望即时编译器(JIT)能够在未来改进,将这两个操作优化为一个操作,因为这很简单。

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