有没有任何方法可以在C#中执行整数除法(没有浮点数或小数点,我需要保持这个整数除法非常快)?
默认的除法只会丢弃分数参数。考虑:
1 / 2 = 0 // That is correct
-1 / 2 = 0 // ... but I want to get (-1) here!我的部门对分红将取正数和负数。我不需要使用if,因为分支将过于昂贵(操作将在实时游戏引擎中非常频繁地运行).
发布于 2019-03-16 12:15:27
除以2是一个简单的按位右移.在@elgonzo(现在删除)提到C#的rightshift的属性之后,我决定看看它是如何工作的,它似乎做了您想做的事情:
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秒。
分支版本的性能似乎与模块化版本差不多:比简单的rightshift慢得多。
发布于 2019-03-16 11:35:35
如果要将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;https://stackoverflow.com/questions/55196178
复制相似问题