代码之家  ›  专栏  ›  技术社区  ›  CookieOfFortune

在Java中,当使用位移时,为什么1<<32!= 1 << 31 << 1?

  •  16
  • CookieOfFortune  · 技术社区  · 17 年前
    int a = 1 << 32;
    int b = 1 << 31 << 1;
    

    为什么 a == 1 ? b 如我所料,为0。

    2 回复  |  直到 17 年前
        1
  •  23
  •   Pshemo    13 年前

    所有移位都以mod 32(整数)和mod 64(长整数)完成。

    section 15.19 of the spec :

    int ,只有五个 逻辑与运算符&(§15.22.1)

    操作数为 long 距离。就好像右手 操作数受位限制 逻辑与运算符&(§15.22.1) 掩码值0x3f。轮班 因此,实际使用的距离

    为什么

    实现定义的行为 统一的行为是过分的 (例如对于某些浮点 精度问题)。因此,尺寸 每种积分类型都精确

    对于轮班操作,也要统一 行为被指定。这可能是 指令(&0x1F或&0x3F) 处理器,尤其是因为它 不是参考存储器。不像for 轮班行为的不同之处在于 戏剧性的如果留给心血来潮 不同的积分结果将是 产生。

    不同处理器的数量 轮班行为的一致性 计数超出-32..+32的范围 分别为32位操作数和

    (下面列出了一些例子。)

    在某些系统上以高性能的方式保持一致的行为,我认为这是一个合理的解决方案。

        2
  •  0
  •   Tom Hawtin - tackline    17 年前

    只要底层处理器有一种模糊合理的移位方式,清除除最低有效位之外的所有位(通常是一条指令)比检查移位是否较大和分支更容易(实际上在ARM上,这通常只添加一条指令,因为所有指令都是有条件的)。