为什么Java和C#有位移操作符?

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中.

  • @Roman:由于CIDR,IP地址作为位序列有意义,而不是数值.对于32位整数,`(IP地址)和(网络掩码)`比在字节数组中循环快大约十倍,而对于32位整数,速度比展开循环快四倍. (2认同)

Mar*_*ell 12

如果我想将数字乘以4,我会写* 4.如果我的目的是左移一些位2位,我会写<< 2.

回答问题:

为什么Java和C#有位移操作符?

我在二进制数据上做了很多工作,我没有考虑整数等 - 只是二进制 - 在这个领域,不断使用移位运算符是完全合乎逻辑的.

当然,我可以输入* 2等等,但我真正想做的就是移位.

这在字节很重要的一系列领域很常见(例如图形编程,序列化等).

此外,还有一些细微的移位操作,你希望它表现得像一个整数,特别是在处理边缘时...当你从地图左移一点时会发生什么的规则,或者右边-换档位地图(-ve VS +五个等)是公知的,但关键的.同样,整数乘法的checked/ unckecked行为有时非常重要.


sta*_*ker 8

你是对的,如果移位运算符仅用作乘法的替代,它应该留给编译器.

我想你忽略了以下应用:

  • 加密/解密
  • CRC计算
  • 位图操作(图形,数据库锁)
  • 压缩/解压缩
  • 设置硬件寄存器的数据
  • 改变编码

还有更多需要在没有本机代码的情况下进行高效实现.