【问题标题】:Java bitwise operator << [duplicate]Java按位运算符<< [重复]
【发布时间】:2016-03-30 09:38:27
【问题描述】:
谁能解释一下为什么下面的位表达式会返回不同的结果:
System.out.println((-1<<31)<<1); // it prints 0
System.out.println(-1<<32); // it prints -1
【问题讨论】:
标签:
java
bit-manipulation
bit-shift
【解决方案1】:
-1<<32 等价于-1<<0,即无操作。原因是移位距离(32) 与0x1f 和32 & 0x1f 为0。
这是在JLS #15.19(强调我的)中定义的:
如果左侧操作数的提升类型为 int,则仅将右侧操作数的最低五位用作移位距离 .就好像右手操作数受到按位逻辑与运算符 & (§15.22.1) 的影响,掩码值为 0x1f (0b11111)。因此,实际使用的移位距离始终在 0 到 31 的范围内,包括 0 到 31。
【解决方案2】:
移位计数值使用模32。所以第二个例子实际上与移位0相同。