我正在使用十六进制值,我需要保留值的符号。我想知道是否有人有创造性的方法来保留int的符号而不使用BigInteger
?我无法使用BigInteger
因为尺寸限制而不在我的图书馆中;我的程序在嵌入式环境中运行。
我有一串十六进制值如下:
55844d000000000080027d801cf6380006f416c0c23d3e4000000000
String ssumI = null;
String ssumQ = null;
String sazI = null;
float isumI = 0;
float isumQ = 0;
float iazI = 0;
ssumI = data.substring(0,8);
isumI = (float)(Integer.parseInt(ssumI, 16)/Math.pow(2,bits));
//55844d00 parses fine
ssumQ = data.substring(8,16);
isumQ = (float)(Integer.parseInt(ssumQ, 16)/Math.pow(2,bits));
//00000000 parses fine
sazI = data.substring(16, 24);
iazI = (float)(Integer.parseInt(sazI, 16)/Math.pow(2,bits));
//80027d80 fails - NumberFormatException
//should be -1,036,173,760 and in the int range
我不能正确理解失败吗?似乎失败是由于符号位被设置。
答案 0 :(得分:3)
如果你想一次存储32位,我认为显而易见的解决方案是用Long.parseLong
解析:
isumI = (float)(Long.parseLong(ssumI, 16) / Math.pow(2, bits));
(你肯定希望将这些值保持为float
吗?你正在以这种方式丢失信息......)
答案 1 :(得分:0)
如果Java 8可用,您可以在其中使用新的无符号操作(How to use the unsigned integer in java 8?)。
isumI = (float)(Integer.parseUnsignedInt(ssumI, 16)/Math.pow(2,bits));
但由于每个字符串都有32位,我认为bits
小于32.在这种情况下,您可以将其重写为
isumI = Integer.parseUnsignedInt(ssumI, 16)/(float)(1 << bits);
如果bits
可以大于32(但小于64),请将1
替换为1L
另外,请注意函数中的位未更改,您应将Math.pow(2, bits)
替换为1 << bits
并将其存储在单独的变量中,而不是一次又一次地重新计算。
无论如何,如果您打算将字符串用作大值,那么您应该将其存储在int
数组中。 float
只有24位有效数字,如果值很大,你可能会失去低8位。