Integer.parseInt 大号和保留号?
Integer.parseInt large number and retain sign?
我正在处理十六进制值,我需要保留值的符号。我想知道是否有人有创造性的方法来保留 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
我是不是理解错了?似乎失败是由于设置了符号位。
如果你想一次存储 32 位,在我看来明显的解决方案是用 Long.parseLong
来解析:
isumI = (float)(Long.parseLong(ssumI, 16) / Math.pow(2, bits));
(不过你确定要将这些值保持为 float
吗?那样你会丢失信息...)
如果Java 8 is available you can use the new unsigned operations in it (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位。
我正在处理十六进制值,我需要保留值的符号。我想知道是否有人有创造性的方法来保留 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
我是不是理解错了?似乎失败是由于设置了符号位。
如果你想一次存储 32 位,在我看来明显的解决方案是用 Long.parseLong
来解析:
isumI = (float)(Long.parseLong(ssumI, 16) / Math.pow(2, bits));
(不过你确定要将这些值保持为 float
吗?那样你会丢失信息...)
如果Java 8 is available you can use the new unsigned operations in it (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位。