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