有什么区别
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/