第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果 Java 的 parseInt 對于有效的 IEEE-754 二進制文件失敗

如果 Java 的 parseInt 對于有效的 IEEE-754 二進制文件失敗

BIG陽 2021-06-25 18:00:18
還有一個與此類似的線程,但它不是此的重復,因此請不要將其標記為這樣。我有一個通信模擬,它獲取測試數據 - 浮點數和整數 - 并將它們轉換為二進制字符串,然后通過管道發(fā)送它們,并由另一端的偵聽器接收它們。然后將它們“解包”并轉換回數字。但是,使用 Integer.parseInt() 進行的轉換會引發(fā)異常,即使消息中的 Binary 顯然是正確形成的 IEEE-754 binary32 單精度格式。    float flt = -45732.9287f;    int intFloat = Float.floatToRawIntBits(flt);    String str = Integer.toBinaryString(intFloat);    System.out.println("------- Now do the Reverse -------");    int revint = Integer.parseInt(str, 2);    .... Throws java.lang.NumberFormatException: For input string: "11000111001100101010010011101110"at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)在沒有基數的情況下使用 parseInt() 會引發(fā)類似的異常:    "int revint = Integer.parseInt(str);" throws an exception too, "java.lang.NumberFormatException: For input string: "11000111001100101010010011101110"at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)".因此,這不僅僅是 Radix 使用問題。使用 Long 和 BigInt 轉換回來是不正確的,因為它們是 64 位 IEEE-754 格式,適用于有符號雙精度,而不是像浮點這樣的有符號單精度數據類型。我有一個解決方案來掩蓋 Java 轉換方法中的不對稱性,但讓我覺得不協(xié)調的是沒有原生 API:    System.out.println("------- Now do the Reverse -------");    int revSign = str.substring(0,1).equals("1") ? -1: 1;    System.out.println("The passed-in sign is:"+revSign);    int revint = Integer.valueOf(str.substring(1), 2);    float revFloat = Float.intBitsToFloat(revint)*revSign;我肯定錯過了什么。
查看完整描述

3 回答

?
月關寶盒

TA貢獻1772條經驗 獲得超5個贊

"11000111001100101010010011101110"是一個以 1 開頭的 32 位二進制數。這意味著它可以表示int2 的補碼中的負數。

但是,Integer.parseInt不希望它的輸入是 2 的補碼表示。它期望符號用前導表示-,而不是用符號位表示,正如您可以在 Javadoc 中閱讀的那樣:

int java.lang.Integer.parseInt(String s, int radix) 拋出 NumberFormatException

將字符串參數解析為第二個參數指定的基數中的有符號整數。字符串中的字符必須都是指定基數的數字(由java.lang.Character.digit(char, int)是否返回非負值決定),除了第一個字符可以是ASCII減號'-' ('\u005Cu002D') 表示負值或 ASCII 加號 '+' ('\u005Cu002B') 表示正值。返回結果整數值。

因此,它被視為"11000111001100101010010011101110"超出int類型范圍的 32 位正數。

以下可用于重新計算 的值intFloat

// replace the leading 1 with - if it's a sign bit

str = (str.length () == 32 && str.charAt (0) == '1') ? ('-' + str.substring (1)) : str;

int revint = Integer.parseInt(str, 2);

// for negative number, we must compute the 2's complement of the number returned

// by parseInt

if (revint < 0) {

  revint = -1 * (revint + Integer.MAX_VALUE + 1);

}

現(xiàn)在兩者intFloat和revint將等于-952982290。


編輯:


Java 確實有您需要的 API,只是您沒有使用正確的方法。由于toBinaryString(int i)返回“整數參數的字符串表示作為基數為 2的無符號整數”,您應該使用Integer.parseUnsignedInt(String, int)以恢復傳遞給的值toBinaryString:


float flt = -45732.9287f;

int intFloat = Float.floatToRawIntBits(flt);

String str = Integer.toBinaryString(intFloat);

System.out.println("------- Now do the Reverse -------");

System.out.println (str);

int revint = Integer.parseUnsignedInt(str, 2);


查看完整回答
反對 回復 2021-06-30
  • 3 回答
  • 0 關注
  • 232 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號