Rom*_*her 5 c# java bit-shift premature-optimization low-level
整数乘法(暂时忘记分裂)之间的差异仍然有利于转移,如果是这样,差异有多大?
它只是看起来这么低级别的优化,即使你想要它不应该(C#/ Java)字节码编译器或jit在大多数情况下捕获它?
注意:我测试为C#编译后的输出(具有单声道的GMC C#编译器版本2.6.7.0)和乘法示例没有使用移用于通过2的倍数乘以时甚至相乘.
C# http://csharp.pastebin.com/hcrRnPrb
cil http://csharp.pastebin.com/0js9F2c1
PS我忘了在字节上使用它有多大帮助,但在使用它时仍然遇到一些麻烦.
Eri*_*ert 22
第一个原因:
有时 - 大多数情况下 - 您希望将整数视为数字.有时虽然整数是表示一组位的便捷方式.
乘法是对数字的操作.
移位是对一组位的操作.
乘法结果与变换结果之间恰好存在关系并不是特别相关.这些操作在逻辑上是不同的.
第二个原因:
C#和Java都是为C开发人员所熟悉的,尽管是表面上的.因此,来自C的常用习语包含在C#和Java中.
Mar*_*ell 12
如果我想将数字乘以4,我会写* 4.如果我的目的是左移一些位2位,我会写<< 2.
回答问题:
为什么Java和C#有位移操作符?
我在二进制数据上做了很多工作,我没有考虑整数等 - 只是二进制 - 在这个领域,不断使用移位运算符是完全合乎逻辑的.
当然,我可以输入* 2等等,但我真正想做的就是移位.
这在字节很重要的一系列领域很常见(例如图形编程,序列化等).
此外,还有一些细微的移位操作,你不希望它表现得像一个整数,特别是在处理边缘时...当你从地图左移一点时会发生什么的规则,或者右边-换档位到地图(-ve VS +五个等)是公知的,但关键的.同样,整数乘法的checked/ unckecked行为有时非常重要.
你是对的,如果移位运算符仅用作乘法的替代,它应该留给编译器.
我想你忽略了以下应用:
还有更多需要在没有本机代码的情况下进行高效实现.