一、IEEE 754標準介紹
IEEE 754是浮點數的二進制計算機表示方式的國際標準。它規定了浮點數的二進制表示方法,包括正負數、零、正負無窮大和NaN。
標準規定了浮點數存儲格式和各位的含義。對於float類型的數據,佔用4個位元組,分別是符號位、階碼和尾數。其中,符號位佔用1位,階碼佔用8位,尾數佔用23位。
二、16進制與float轉換方式
對於一個32位的float類型的變量,其內存存儲格式為:
[符號位][階碼][尾數] 1 8 23
將其轉換為16進制時,需將每四個二進制位轉換為一個十六進制數,即每個位元組表示為2個十六進制數。因此,一個float類型的變量可以轉換為8個十六進制字符的字符串。
而將一個16進制字符串轉換為float類型的變量,則需要按照以下步驟:
1、將十六進制字符串轉換為對應的二進制字符串。
2、根據IEEE 754標準,從二進制字符串中分離符號位、階碼和尾數。
3、使用公式:(-1)^sign_bit * (1 + frac) * pow(2, exp – 127) 計算出十進制浮點數。
三、代碼實現
以下是將16進制字符串轉換為float類型的函數:
/** * 將16進制字符串轉換為float類型的變量 * @param hexString 16進制字符串(長度為8) * @return 轉換後的float類型變量 */ public static float hexStringToFloat(String hexString) { // 將16進制字符串轉換為對應的二進制字符串 String binaryString = hexToBinary(hexString); // 將二進制字符串分離符號位、階碼和尾數 int sign = binaryString.charAt(0) == '0' ? 1 : -1; // 符號位 int exponent = Integer.parseInt(binaryString.substring(1, 9), 2) - 127; // 階碼 String fraction = binaryString.substring(9); // 尾數 // 計算浮點數值(-1)^sign_bit * (1 + frac) * pow(2, exp - 127) float value = 0; for (int i = 0; i < fraction.length(); i++) { if (fraction.charAt(i) == '1') { value += Math.pow(2, -(i + 1)); } } value += 1; value *= Math.pow(2, exponent); value *= sign; return value; } /** * 將16進制字符串轉換為對應的二進制字符串 * @param hexString 16進制字符串(長度為8) * @return 轉換後的二進制字符串 */ private static String hexToBinary(String hexString) { StringBuilder binaryString = new StringBuilder(); for (int i = 0; i < 8; i++) { String binary = Integer.toBinaryString(Integer.parseInt(hexString.substring(i, i + 1), 16)); while (binary.length() < 4) { binary = "0" + binary; } binaryString.append(binary); } return binaryString.toString(); }
以下是將float類型的變量轉換為16進制字符串的函數:
/** * 將float類型的變量轉換為16進制字符串 * @param floatValue 浮點數值 * @return 轉換後的16進制字符串(長度為8) */ public static String floatToHexString(float floatValue) { int bits = Float.floatToIntBits(floatValue); // 將float類型的變量轉換為對應的int類型 StringBuilder hexString = new StringBuilder(Integer.toHexString(bits)); while (hexString.length() < 8) { hexString.insert(0, "0"); } return hexString.toString(); }
四、實例演示
以下是一個將16進制字符串轉換為float類型的變量的實例:
String hexString = "40a00000"; float floatValue = hexStringToFloat(hexString); System.out.println("16進制字符串 " + hexString + " 對應的float類型的變量為 " + floatValue);
輸出結果為:
16進制字符串 40a00000 對應的float類型的變量為 5.0
以下是一個將float類型的變量轉換為16進制字符串的實例:
float floatValue = 1.5f; String hexString = floatToHexString(floatValue); System.out.println("float類型的變量 " + floatValue + " 對應的16進制字符串為 " + hexString);
輸出結果為:
float類型的變量 1.5 對應的16進制字符串為 3fc00000
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/199900.html