"Math.DivRem"和%运算符之间的区别?

mbr*_*nyc 22 .net math operators division

System.Math.DivRem()%运营商有什么区别?

Bol*_*ock 27

%给你一个除法的余数,并完全丢弃商,同时DivRem()计算并返回两者的商和余数.

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

int remainder = 10 % 3;
Console.WriteLine(remainder); // 1
Run Code Online (Sandbox Code Playgroud)

如果您需要知道在余数为1之前10被除以3的次数,请使用DivRem(),返回商并将余数存储在out参数中:

int quotient, remainder;
quotient = Math.DivRem(10, 3, out remainder);
Console.WriteLine(quotient);  // 3
Console.WriteLine(remainder); // 1
Run Code Online (Sandbox Code Playgroud)

  • 在VB.NET中,整数除法运算符是\:`Dim quotient As Integer = 10\3` (2认同)

pou*_*pou 9

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

在任何一种情况下(除非你有一个智能编译器),你最终可以计算两次相同的部门.由于在任何处理器上(即使在硬件中实现),分区永远不会很快,因此使用Math.DivRem可以为JIT提供一个很好的"提示"来仅计算一次值.

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


小智 6

可能是一个优化,但不幸的是产生与分区相同的IL PLUS mod操作.

在典型的体系结构(x86和朋友)上,两者可以从单个操作中获得,但.NET JIT似乎没有优化(在我的测试中).

所以以下两个是等价的:

quotient = Math.DivRem(10, 3, out remainder);
Run Code Online (Sandbox Code Playgroud)

VS:

quotient  = 10 / 3;
remainder = 10 % 3;
Run Code Online (Sandbox Code Playgroud)

除了后者更具可读性.

为了记录这个丑陋的选项在x86和x64上更快:

quotient  = 10 / 3;
remainder = 10 - (3*quotient);
Run Code Online (Sandbox Code Playgroud)

希望JIT有一天会改进,将两个操作优化为一个,因为它是微不足道的.