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

Java如何将负二进制字符串转换为十进制数?

问题:将无负号前缀的二进制补码字符串转为整数的现成方法

Integer.parseInt(str, 2) 可用于将二进制字符串转换为十进制整数,但如果是表示负数的二进制补码字符串(不带负号前缀,直接以最高位1开头),该方法会抛出NumberFormatException。有没有现成的方法能直接完成这类转换?

测试代码

public static void main(String[] args) throws InterruptedException {
    byte[] bs = {-128,1,2,0};
    String bsBits = "10000000000000010000001000000000";//bs的二进制表示
    String bsBitsComplement = "-1111111111111101111111000000000";//bsBits的带负号补码形式
    int v = 0;//bs转换后的int值
    for (int i = 0; i < bs.length; i++) {
        v = (v << 8) | Byte.toUnsignedInt(bs[i]);
    }
    System.out.println(v);
    String sv = Integer.toBinaryString(v);
    System.out.println(sv);
    System.out.println(Integer.parseInt(bsBitsComplement, 2));//转换成功
    System.out.println(Integer.parseInt(bsBits, 2));//抛出异常
}

运行输出

-2147417600
10000000000000010000001000000000
-2147417600
Exception in thread "main" java.lang.NumberFormatException: For input string: "10000000000000010000001000000000" under radix 2
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
    at java.base/java.lang.Integer.parseInt(Integer.java:668)
    at baseproj/basetest.Main.main(Main.java:39)

解决方案

有几种现成的方式可以处理这类无负号前缀的二进制补码字符串转换:

  • 使用Integer.parseUnsignedInt转换:该方法会将二进制字符串当作无符号整数解析,赋值给int类型时Java会自动处理符号位:

    int result = Integer.parseUnsignedInt(bsBits, 2);
    System.out.println(result); // 输出 -2147417600
    
  • 使用Long.parseLong强转:对于32位二进制补码字符串,先用Long.parseLong解析,再强转为int即可保留补码符号:

    int result = (int) Long.parseLong(bsBits, 2);
    System.out.println(result); // 输出 -2147417600
    
  • 通用位数处理(含大数):如果是其他位数的补码字符串,可对应使用Short.parseShort(16位)、Long.parseLong(64位),或用BigInteger做兼容处理:

    BigInteger bigInt = new BigInteger(bsBits, 2);
    int result = bigInt.intValue();
    System.out.println(result); // 输出 -2147417600
    

内容的提问来源于stack exchange,提问作者Jack Ma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:09:22