我无法找到一种方法将32位二进制补码二进制数转换为java中的小数。当它应该是负数时,我得到溢出错误或数字非负。使用java将32位二进制补码转换为十进制数
String bin = "11111111111111111111111111111110";
long foo = Long.parseLong(bin);
System.out.println(foo);
这是我尝试过的一件事情,我想我需要使用很长时间,因为它可以容纳多达64位。任何帮助都会很棒。谢谢
我无法找到一种方法将32位二进制补码二进制数转换为java中的小数。当它应该是负数时,我得到溢出错误或数字非负。使用java将32位二进制补码转换为十进制数
String bin = "11111111111111111111111111111110";
long foo = Long.parseLong(bin);
System.out.println(foo);
这是我尝试过的一件事情,我想我需要使用很长时间,因为它可以容纳多达64位。任何帮助都会很棒。谢谢
radix
是使用的编号系统的基础。
public static void main(String[] args) {
int bits = (int) Long.parseLong("11111111111111111111111111111110", 2);
System.out.println(bits);
}
输出
-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个字符的二进制字符串。
你是正确的 - 你需要使用 “长” 在这种情况下。
既然你正在做的二进制补码(没有的补),你可以使用“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
一个32位二进制补码数是' int'。 – 2014-11-25 03:59:49