Java Integer左移

时间:2015-12-10 04:39:47

标签: java bit-manipulation bit-shift

我现在对java左移操作感到有点困惑,

1<<31 =  0x80000000  --> this I can understand

但是

1<<32 =  1       Why is this?
1<<33 =  2       

看起来更多的移动值,取值的模数32。

感谢大家的回复和JLS的报价。

我只是想知道更多。知道它以这种方式设计的原因吗?或者只是一些惯例?显然C没有这个怪癖?

  
    

感谢@paxdiablo。看起来C声明这个行为未定义。

  

我在这里有一些个人假设:

  

ARM体系结构参考手册A7.1.38

     

语法   LSL Rd,Rm,#immed_5

     

其中:

     

Rd 是存储操作结果的寄存器。

     

Rm 寄存器是否包含要移位的值。

     

immed_5 指定移位金额,范围为0到31.

在指令级别,immeidate immed_5 只需要5位就可以避免无意义的操作,从而节省一些指令空间。我想高级语言只是将这个约定统一起来,以避免在编译指令时无意义的努力。

2 个答案:

答案 0 :(得分:8)

根据Java语言规范15.19. Shift Operators(稍微解释):

  

如果左侧操作数的提升类型为int,则 仅使用右侧操作数的五个最低位 换班车距离。就好像右手操作数受到带有掩码值&0x1f的按位逻辑AND运算符0b11111的影响。因此,实际使用的移动距离始终在031的范围内,包括在内。

这意味着(例如)33,即6位二进制100001,在使用之前会被缩减为5位00001。因此x << 33x << 1相同。

答案 1 :(得分:-1)

System.out.println(Integer.toBinaryString(1 << 32)); 

将二进制1(10)向左移动32次。因此:十进制1

System.out.println(Integer.toBinaryString(1 << 33)); 

现在,int是4个字节,因此是32位。因此,当你移动33时,它相当于移位1.因此:小数为2