You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段移位操作代码的输出与预期不符?(关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:16:04