代码之家  ›  专栏  ›  技术社区  ›  Arthur Ulfeldt

为什么1>>32==1?

  •  29
  • Arthur Ulfeldt  · 技术社区  · 14 年前

    java版本“1.6.0\u 0” OpenJDK运行时环境(IcedTea6 1.4.1)(6b14-1.4.1-0ubuntu13) OpenJDK 64位服务器虚拟机(内部版本14.0-b08,混合模式)

    class Tmp {
        public static void main(String[] args) {
            System.out.println("1>>1 = "+(1>>1));
            System.out.println("1>>2 = "+(1>>2));
            System.out.println("1>>31 = "+(1>>31));
            System.out.println("1>>32 = "+(1>>32));
            System.out.println("1>>33 = "+(1>>33));
        }
    }
    

    运行时生成:

    1>>1 = 0
    1>>2 = 0
    1>>31 = 0
    1>>32 = 1 <---------- should be 0 i think
    1>>33 = 0
    

    我需要写我自己的右班来检查这个吗?

    2 回复  |  直到 14 年前
        1
  •  33
  •   ajduke    11 年前

    http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22.1

    15.19值班员

    如果左侧操作数的提升类型为 , 只有右操作数的五个最低阶位用作移位距离。这就好像右操作数接受了位逻辑“与”运算符 &(§15.22.1) 掩码值为0x1f . 因此,实际使用的移动距离始终在0到31之间(包括0到31)。

    ,那么 . 这就好像右操作数接受了位逻辑“与”运算符&(§15.22.1)与 掩码值0x3f . 因此,实际使用的移动距离始终在0到63之间(包括0到63)。

        2
  •  19
  •   amara    14 年前

    不是虫子。在 n >> m (256 >> 37) == 8 这是真的。

    编辑:如果您使用ints,则这是正确的。如果是长的,那就看最后一个 m的位,或mods乘以64。