Java整数左移的奇怪结果

Java整数左移的奇怪结果,java,bit-manipulation,bit-shift,Java,Bit Manipulation,Bit Shift,我现在对java的左移操作有点困惑 1<<31 = 0x80000000 --> this I can understand 1符合Java语言规范15.19。轮班操作员(稍作解释): 如果左侧操作数的提升类型为int,则仅将右侧操作数的五个最低阶位用作移位距离。这就好像右侧操作数使用掩码值0x1f或0b11111接受位逻辑AND运算符&。因此,实际使用的换档距离始终在0到31的范围内,包括在内 这意味着(例如)33,作为6位二进制100001,在使用之前被减少到5位00

我现在对java的左移操作有点困惑

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

1符合Java语言规范
15.19。轮班操作员
(稍作解释):

如果左侧操作数的提升类型为
int
则仅将右侧操作数的五个最低阶位用作移位距离。这就好像右侧操作数使用掩码值
0x1f
0b11111
接受位逻辑AND运算符
&
。因此,实际使用的换档距离始终在
0
31
的范围内,包括在内


这意味着(例如)
33
,作为6位二进制
100001
,在使用之前被减少到5位
00001
。因此
x
System.out.println(Integer.tobinarysting(1)如果一个32位二进制1实际上左移了32位,结果将是0,而不是1。也许你在考虑旋转?谢谢@Paxdiablo。你知道为什么它是这样设计的吗?或者它只是某种约定吗?显然C没有这个怪癖?@Bill,C有一个更糟糕的怪癖,也就是说,
,如果ri的值ght操作数为负数或大于或等于提升后的左操作数的宽度,行为未定义。
Java完全指定了C没有指定的许多行为,这是一种根据经验进行的清理。关于为什么它不移位32位,而只是将值设置为零,很难看到这种情况的用例。位移位ing通常用于提取/设置位,您无法从已转换为遗忘的值中提取任何有用位:-)
1<<32 =  1       Why is this?
1<<33 =  2       
System.out.println(Integer.toBinaryString(1 << 32)); 
System.out.println(Integer.toBinaryString(1 << 33));