System.Math.DivRem()
和%
运算符之间有什么区别?
%
可以得到一个除法的余数并且不考虑商,而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
这是一种优化方式。某些处理器能够同时计算两个值。而其他处理器不能在硬件上进行除法运算(必须使用非常缓慢的软件例程)。
无论哪种情况(除非您有一个智能编译器),否则您可能会计算相同的除法两次。由于除法在任何处理器上都不快(即使在硬件中实现),因此使用 Math.DivRem 给 JIT 提供了一个不错的“提示”,只计算一次这些值。
iirc Mono 没有实现这种优化,甚至我也不确定 MS 是否实现了。
这本来可以是一个优化,但不幸的是它生成的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);
/
运算符进行整数除法,而不是%
:int quotient = 10 / 3;
- BoltClockDim quotient As Integer = 10 \ 3
。 - BoltClockdouble result = a / (double)b;
这是两个整数相除的非整数结果。 - ToolmakerSteve