有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用java将32位2的补码转换为十进制

在java中,我很难找到将32位2的补码二进制数转换为十进制数的方法。我要么得到一个溢出错误,要么当数字应该是负数时,它就变成非负数

String bin = "11111111111111111111111111111110";
long foo = Long.parseLong(bin);
System.out.println(foo);

这是我尝试过的方法之一,我想我需要使用long,因为它最多可以容纳64位。任何帮助都会很好。谢谢


共 (3) 个答案

  1. # 1 楼答案

    你是对的-在这种情况下,你需要使用“Long”

    由于您使用的是两个补码(不是一个补码),因此可以使用基数为“2”的“parseLong()”:

    public class X {
    
      public static void main (String[] args) {
        String bin = "11111111111111111111111111111110";
        int i = (int)Long.parseLong(bin, 2);
        System.out.println("parseInt(" + bin + ", 2)=" + i);
      }
    
    }
    // Output:
    parseInt(11111111111111111111111111111110, 2)=-2
    
  2. # 2 楼答案

    radix是所用编号系统的基础

    public static void main(String[] args) {
            int bits = (int) Long.parseLong("11111111111111111111111111111110", 2);
            System.out.println(bits);
        }
    

    输出

    -2
    
  3. # 3 楼答案

    如果要解析二进制值,需要提供两个基数

    long foo = Long.parseLong(bin, 2);
    

    您可以在Java doc page上看到一个示例:

    parseLong("1100110", 2) returns 102L.

    如果没有基数,它将使用base-10,并且1032将无法放入long

    请记住,对于32个字符位的字符串,这将为您提供无符号变量。如果要在long中使用有符号变量,可以使用:

    if (foo > 0x7fffffffL) foo = -(0x100000000L - foo);
    

    然后再调整它

    或者,如果合适,可以强制将其转换为整数:

    int foo = (int)Long.parseLong(bin,2);
    

    要求给Integer.parseInt()一个有符号的数字意味着它不适合最左边1位的32个字符的二进制字符串