为何这段移位操作代码的输出与预期不符?(关于shift)
关于Java无符号右移(>>>)的二进制输出疑问
先修正你代码里的拼写错误(方法名maain应为main),代码如下:
public static void main(String[] args){ int a = -11; System.out.println(" a= "+a+"("+Integer.toBinaryString(a)+")"); System.out.println(" a>>2= "+(a>>2)+"("+Integer.toBinaryString(a>>2)+")"); System.out.println(" a>>>2= "+(a>>>2)+"("+Integer.toBinaryString(a>>>2)+")"); }
你的理解有部分正确,但需要注意Integer.toBinaryString()的输出规则:
- -11的32位补码:Java中
int是32位有符号整数,-11的补码为11111111 11111111 11111111 11110101 - 无符号右移的实际结果:
>>>确实是右移后左侧补0,移位后的完整32位二进制就是你说的001111111111111111111111111101 - 输出差异的原因:
Integer.toBinaryString()只会输出二进制数的有效位(从最高位的1开始),不会补前导零。所以实际控制台输出的是1111111111111111111111111101,而非带前导00的完整32位字符串。
如果想要看到包含前导零的完整32位二进制,可以用格式化输出:
String full32Bit = String.format("%32s", Integer.toBinaryString(a>>>2)).replace(' ', '0'); System.out.println(full32Bit);
内容的提问来源于stack exchange,提问作者changhoon seong
相关产品推荐
相关产品推荐

