【问题标题】:Integer.parseInt large number and retain sign?Integer.parseInt 大数并保留符号?
【发布时间】:2015-03-20 08:09:04
【问题描述】:

我正在使用十六进制值,我需要保留值的符号。我想知道是否有人有创造性的方法来保留 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

我没有正确理解失败吗?似乎失败是由于设置了符号位。

【问题讨论】:

  • BigInteger 是显而易见的解决方案 - 那么为什么不使用它呢?
  • 由于大小限制,它不在我的库中,我的程序在嵌入式环境中运行
  • 对,所以你应该把它放在你的问题中。任何时候由于您处于不寻常的上下文中而导致明显的解决方案不合适时,您都应该解释该上下文。
  • 除非 bits 是浮点值或大于 31,否则使用 1 << bits 而不是 Math.pow(2,bits)

标签: java parseint


【解决方案1】:

如果您想一次存储 32 位,我认为明显的解决方案是使用 Long.parseLong 进行解析:

isumI = (float)(Long.parseLong(ssumI, 16) / Math.pow(2, bits));

(但是,您确定要将这些值保留为 float 吗?那样会丢失信息...)

【讨论】:

    【解决方案2】:

    如果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 &lt;&lt; bits 并将其存储在单独的变量中,而不是一次又一次地重新计算。

    无论如何,如果您打算将字符串用作大值,则应将其存储在int 数组中。 float 只有 24 位有效位,如果值很大,您可能会丢失低 8 位。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 2018-07-18
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      相关资源
      最近更新 更多