整数除法在C#中向下舍入(对于否定)

问题描述 投票:1回答:2

有没有办法在C#中执行整数除法(没有浮点数或小数,我需要保持这个非常快)将数字向下舍入?

默认除法只丢弃分数参数。考虑:

 1 / 2 = 0 // That is correct
-1 / 2 = 0 // ... but I want to get (-1) here!

我的部门将采用dividor的正数和负数。我不需要使用if,因为分支将太昂贵(操作将在实时游戏引擎中非常频繁地运行)...

c# math
2个回答
2
投票

除以2是一个简单的按位右移。在@ elgonzo(现已删除)提到C#右移的属性之后,我决定看看它是如何工作的,它似乎完全符合你的要求:

var result = number >> 1;

这给出了以下结果:

11 -> 5 10 -> 5 2 -> 1 1 -> 0 -1 -> -1 -2 -> -1 -32 -> -16 -33 -> -17

int.MaxValue和MinValue也有效。

在性能方面,这似乎几乎是目前接受的使用模运算符的答案的两倍。使用简单的移位划分(相同)100000000随机数在我的机器上花费2.17秒,而使用模数的版本需要3.1到4.0秒。

分支版本似乎与模数版本大致相同:明显慢于简单右移。


2
投票

如果你想用a划分b

由于溢出而不会失败的方法:

int res = a / b;
return (a < 0 && a != b * res) ? res - 1 : res;

由于负溢出,以下方法可能会失败。

int mod = a % b;
if (mod < 0) {
  mod += b;
}
return (a - mod) / b;

mod += b混乱,因为a % b可能是负面的。更短的方式:

return (a - (a % b + b) % b) / b;

更明确一个:

return a >= 0 ? a / b : (a - b + 1) / b;
© www.soinside.com 2019 - 2024. All rights reserved.