移位类型的位大小

时间:2014-08-28 12:42:55

标签: java bit-manipulation bit-shift

我正在玩转移,我对一个案例感到困扰:

    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)

这是我的期望。

2 个答案:

答案 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