有没有办法在C#中执行整数除法(没有浮点数或小数,我需要保持这个非常快)将数字向下舍入?
默认除法只丢弃分数参数。考虑:
1 / 2 = 0 // That is correct
-1 / 2 = 0 // ... but I want to get (-1) here!
我的部门将采用dividor的正数和负数。我不需要使用if
,因为分支将太昂贵(操作将在实时游戏引擎中非常频繁地运行)...
除以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秒。
分支版本似乎与模数版本大致相同:明显慢于简单右移。
如果你想用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;