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
相关产品推荐
相关产品推荐

