谁能解释一下为什么下面的按位表达式会返回不同的结果:
System.out.println((-1<<31)<<1); // it prints 0
System.out.println(-1<<32); // it prints -1发布于 2016-03-30 17:43:26
-1<<32等同于-1<<0,即no-op。原因是移位距离(32)与0x1f进行and运算,32 & 0x1f为0。
这是在JLS #15.19 (我的重点)中定义的:
如果左操作数的提升类型为,则仅将右操作数的最低五位用作移位距离。这就好像右边的操作数受到一个位逻辑AND运算符的影响& (§15.22.1),掩码值为0x1f (0b11111)。因此,实际使用的移位距离始终在0到31之间(包括0和31)。
发布于 2016-03-30 17:43:42
移位计数值以32为模使用。所以第二个例子实际上和移位0是一样的。
https://stackoverflow.com/questions/36304960
复制相似问题