我正在尝试将基数为10的数字转换为基数2并返回到基数10.它仅适用于正数argument_decimal
argument_binary = Integer.toBinaryString(argument_decimal);
back_converted_argument_decimal = Integer.valueOf(argument_binary, 2);
对于argument_decimal beeing negative,我得到“java.lang.NumberFormatException:For input string:”11111111111111111111111111111111“”
编辑:这就是我的工作:latitude_binary = Integer.toBinaryString((int)(latitude_decimal * 1000000));
back_converted_latitude_decimal = Long.parseLong(latitude_binary, 2) / 1000000.0;
这给我带来了糟糕的结果,比如-1.1正在向后转换为4293.867296
答案 0 :(得分:4)
尝试经历一段时间:
String binary = Integer.toBinaryString(-1);
long l = Long.parseLong(binary, 2);
int i = (int) l;
经过测试和工作。
为什么这样做是因为-1在系统内存中表示为32位1的序列。使用toBinaryString方法时,它使用该精确表示创建一个字符串。但是,32位的一个实际上等于2 ^ 32 - 1.这对于int(4个字节)来说太大了,因为int来自[-2 ^ 31,2 ^ 31-1]。这是因为最左边的位代表符号。因此,要修复溢出,首先将1和0字符的序列解释为Long。很长的时间会做,因为长的最大值是2 ^ 63-1。然后将long转换为int。这可以通过简单地取低32位来完成。
您的代码中的错误是您没有将Long.parseLong强制转换为int。所以这应该有效:
lat_bin = Integer.toBinaryString((int)(lat_dec * 1000000));
lat_dec_conv = ((int) Long.parseLong(lat_bin, 2)) / 1000000.0;
答案 1 :(得分:0)
public static void convertStringToDecimal(String binary) {
int decimal = 0;
int power = 0;
if (binary.charAt(0) == '1' && binary.length() == 32) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < binary.length(); i++) {
builder.append((binary.charAt(i) == '1' ? '0' : '1'));
}
while (binary.length() > 0) {
int temp = Integer
.parseInt(builder.charAt((binary.length()) - 1)+"");
decimal += temp * Math.pow(2, power++);
binary = binary.substring(0, binary.length() - 1);
}
System.out.println((decimal + 1) * (-1));
} else {
while (binary.length() > 0) {
int temp = Integer
.parseInt(binary.charAt((binary.length()) - 1) + "");
decimal += temp * Math.pow(2, power++);
binary = binary.substring(0, binary.length() - 1);
}
System.out.println(decimal);
}
}