2014-11-25 618 views
1

我无法找到一种方法将32位二进制补码二进制数转换为java中的小数。当它应该是负数时,我得到溢出错误或数字非负。使用java将32位二进制补码转换为十进制数

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

这是我尝试过的一件事情,我想我需要使用很长时间,因为它可以容纳多达64位。任何帮助都会很棒。谢谢

+1

一个32位二进制补码数是' int'。 – 2014-11-25 03:59:49

回答

0

radix是使用的编号系统的基础。

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

输出

-2 
2

如果你想解析一个二进制值,你需要提供两个基数或基数。

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

你可以看到在Java doc page一个例子:

parseLong("1100110", 2)回报102L

没有基数,它使用base-10,并且1032将不适合long。请注意,对于一个32位字符串,这会给你无符号的变体。如果你想在一个long签署的变种,您可以使用:

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

事后调整它

或者你可以用力将其转换为整数,如果这是合适的:

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

的要求Integer.parseInt()得到有符号数字表示它不适用于最左边1位的32个字符的二进制字符串。

0

你是正确的 - 你需要使用 “长” 在这种情况下。

既然你正在做的二进制补码(没有的补),你可以使用“parseLong()”与“2”基数:

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 
相关问题