代码之家  ›  专栏  ›  技术社区  ›  Roman A. Taycher

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

  •  5
  • Roman A. Taycher  · 技术社区  · 15 年前

    它看起来只是一个低级的优化,即使您想要它,(C#/Java)到字节码编译器或jit在大多数情况下不应该捕获它吗?

    注意:我测试了C#的编译输出(使用gmcs Mono C#编译器版本2.6.7.0),乘法示例没有使用shift进行乘法,即使乘法是2的倍数。

    C级# http://csharp.pastebin.com/hcrRnPrb

    http://csharp.pastebin.com/0js9F2c1

    我忘了在字节上使用它可能有点用处,但在数字上使用它仍然有一些困难。

    8 回复  |  直到 15 年前
        1
  •  8
  •   stacker    15 年前

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

    我想你忽略了这样的应用程序:

    • 加密/解密
    • CRC计算
    • 位图操作(图形、数据库锁)
    • 为硬件寄存器设置数据
    • 更改编码

        2
  •  22
  •   Eric Lippert    15 年前

    第一个原因:

    有时-大多数时候-你想把一个整数当作 . 有时,尽管整数是表示一组位的方便方法。

    乘法是对数字的运算。

    移位是对一组位的操作。

    乘法的结果和移位的结果之间恰好存在某种关系,这一点并不是特别相关。操作是 与众不同。

    第二个原因:

    C#和Java都是为C开发人员所熟悉而设计的,尽管只是肤浅的层次。因此,C语言中常见的习语都包含在C语言和Java语言中。

        3
  •  12
  •   Marc Gravell    15 年前

    * 4 . 如果我的目的是左移一些位2个地方,我会写 << 2 .

    再问一个问题:

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

    我没有考虑整数等等 完全合乎逻辑

    * 2 我真正想做的 就是移位。

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

    微妙之处 不要 希望它的行为像一个整数,特别是在处理边缘时。。。当你在地图上左移一点或右移一点时会发生什么的规则 进入之内 地图(-ve vs+ve等)很好理解,但很关键。同样地 checked unckecked 整数乘法的行为有时非常重要。

        4
  •  1
  •   Thorbjørn Ravn Andersen    15 年前

    你要问的不是为什么C/Java中有位移位操作符,而是为什么 javac 编译器不会将幂为2的乘法和除法优化为位移位。

    对此的下意识反应是乘法和除法的语义不同于位移位,因此它不能100%地映射以替换运算。

    此外,您还忘记了在JIT(HotSpot)中发生的额外编译步骤,在JIT中发生了各种额外的优化。坦率地说,不需要优化这个特定的步骤,而C语言是编译器生成代码的地方。

        5
  •  0
  •   SingleNegationElimination    15 年前

    它们是否等同于其他操作,编译器是否足够聪明以高效地实现这些操作,其实并不重要。如果这就是我们要去的地方,那么你只需要一个宏汇编程序和一个非常好的链接时间优化器,也许在一个带有垃圾收集器的虚拟机上。这些不是语言设计师通常追求的目标。

        6
  •  0
  •   SPIRiT_1984    15 年前

    例如,您的程序可能会使用位掩码之类的内容。在这种情况下,位移位操作是必要的。或者,如果您只是在解决一些奇怪的任务,需要以指定的方式对状态进行编码。

    tutorial -大多数样本来自数学问题。如果你只是在做一个网站或一个GUI应用程序,你可能不需要改变,但有时你真的需要。。。

        7
  •  0
  •   Seth    15 年前

    除了这里的其他原因之外,在很多情况下,您可能需要转换(或其他位操作)以通过网络与第三方库或远程应用程序接口。

        8
  •  0
  •   Rune FS    15 年前