我正在玩转移,我对一个案例感到困扰:
int maxint = Integer.MAX_VALUE;
LOG.debug("maxint << 31 ---> {} ({})", maxint << 31 , Integer.toBinaryString(maxint << 31 ));
LOG.debug("maxint << 32 ---> {} ({})", maxint << 32 , Integer.toBinaryString(maxint << 32 ));
LOG.debug("maxint << 33 ---> {} ({})", maxint << 33 , Integer.toBinaryString(maxint << 33 ));
并打印:
maxint << 31 ---> -2147483648 (10000000000000000000000000000000)
maxint << 32 ---> 2147483647 (1111111111111111111111111111111)
maxint << 33 ---> -2 (11111111111111111111111111111110)
所以问题是如果班次31离开&#39; 1&#39;在MSB然后转移32不应该将其移出并返回0?
更进一步,我从shift 31结果(Integer.MIN_VALUE)开始,然后移动1。
int minInt = -2147483648;
LOG.debug("minInt << 1 ---> {} ({})", minInt << 1 , Integer.toBinaryString(minInt << 1 ));
LOG.debug("minInt << 2 ---> {} ({})", minInt << 2 , Integer.toBinaryString(minInt << 2 ));
并打印:
minInt << 1 ---> 0 (0)
minInt << 2 ---> 0 (0)
这是我的期望。
答案 0 :(得分:7)
http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19
如果左侧操作数的提升类型是int,则只有五个 右侧操作数的最低位用作移位 距离。好像右手操作数受到了a 按位逻辑AND运算符&amp; (§15.22.1),掩码值为0x1f (0b11111)。因此实际使用的换档距离总是在 范围0到31,包括在内。
和类似的六位长。这种行为也是允许的,并且通常在C和C ++中实现,尽管在Java中不是必需的。
也是我第一次搜索错过的Shift operator in Java bizarre program output的副本。
答案 1 :(得分:2)
转移工作模式32 a << b == a <<(b % 32)
ps:对于长模64