c# - 将数字加倍 - 左移与乘法

标签 c# .net algorithm

有什么区别

int size = (int)((length * 200L) / 100L); // (1)

int size = length << 1; // (2)

(两种情况下长度都是整数)

我假设两个代码片段都想将长度参数加倍。

我很想使用 (2) ...那么使用 (1) 有什么好处吗?我查看了发生溢出时的边缘情况,两个版本似乎具有相同的行为。

请告诉我我错过了什么。

最佳答案

想法<<比乘法快是在推理,好像 .NET jit 编译器实际上是 1970 年代编写的优化不佳的 C 编译器。即使这是真的,此时的差异也会以皮秒为单位进行测量,即使存在差异,但可能并不存在。

编写易于阅读的代码。让编译器负责微优化。根据分析实际场景优化您的代码,而不是再猜测编译器将生成什么。

此外,移位运算符具有与乘法相同的语义。例如,考虑以下编辑顺序:

Jill 的原创程序:

int x = y * 2;

Bob 编辑:愚蠢的 Jill,我会让这个“更快”:

int x = y << 1;

实习生 Larry 编辑:哦,我们有一个错误,我们差了一个,让我修复它:

int x = y << 1 + 1;

Larry 刚刚引入了一个新的 bug。 y * 2 + 1 不同于 y << 1 + 1;后者实际上是 y * 4。

我在实际生产代码中看到过这个错误。人们很容易陷入“移位就是乘法”的心态,而忘记移位的优先级比加法低,而乘法的优先级比加法高

我从来没有见过有人通过写 x * 2 来乘以 2 而弄错算术优先级。人们理解 + 和 * 的优先级。很多人忘记了转移的优先级是什么。您实际上没有节省的皮秒是否值得任何数量的潜在错误?我拒绝。

关于c# - 将数字加倍 - 左移与乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3059719/

相关文章:

c# - 数据表删除行并接受更改

c# - 如果之前的事件仍然有效,System.Timers.Timer 是否可以结束事件?

c# - 有没有办法确保不使用隐式文化设置?

.net - 自动化部署asp.net mvc站点

python - 从距原点给定距离的图中查找路径的所有组合

python - 在 Python 中使用搜索算法解决三狼三羊之谜

c# - 使用 DotNetOpenAuth 从 OpenID 提供商获取电子邮件地址

c# - Global.asax 没有捕获到错误?

c# - 字典中元素的顺序

c++ - 矩形边界内的旋转线