有没有一种方法可以在C#中进行整数除法(不使用浮点或十进制数,我需要保持速度很快),并向下舍入数字?
默认的除法只是舍弃小数部分。请考虑:
1 / 2 = 0 // That is correct
-1 / 2 = 0 // ... but I want to get (-1) here!
我的部门将采用正数和负数作为除数。我无需使用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;
return (a - (a % b + b) % b) / b;
还有更加清晰的解释:
return a >= 0 ? a / b : (a - b + 1) / b;
n>>1
慢得多,而完成同样的工作。 - oerkelensn >> 1
只能被2整除。您需要处理其他整数。 - user2956272
if
或其他分支形式,但这是非常昂贵的操作。 - PiotrK