我在查找从32位二进制补码二进制数转换为java中十进制数的方法时遇到了麻烦。我得到一个溢出错误,或者当它应该是负数时,数字会出现非负数。
String bin = "11111111111111111111111111111110";
long foo = Long.parseLong(bin);
System.out.println(foo);
这是我尝试的事情之一,我认为我需要长时间使用,因为它可以容纳64位。任何帮助都会很棒。感谢
答案 0 :(得分:2)
如果要解析二进制值,则需要提供两个基数或基数。
long foo = Long.parseLong(bin, 2);
您可以在Java doc page上看到一个示例:
parseLong("1100110", 2)
返回102L
。
如果没有基数,则使用base-10,而1032
将不适合long
。
请记住,对于32个字符的位字符串,这将为您提供 unsigned 变体。如果您想在long
中使用已签名的变体,则可以使用:
if (foo > 0x7fffffffL) foo = -(0x100000000L - foo);
之后调整它
如果合适,你可以强行将它强制转换为整数:
int foo = (int)Long.parseLong(bin,2);
Integer.parseInt()
被赋予签名号码的要求意味着它不适合32字符二进制字符串,最左边的1位。
答案 1 :(得分:0)
radix
是使用过的编号系统的基础。
public static void main(String[] args) {
int bits = (int) Long.parseLong("11111111111111111111111111111110", 2);
System.out.println(bits);
}
<强>输出强>
-2
答案 2 :(得分: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