关于解析的具体写法是从一篇文章中摘取下来的
原文url:https://blog.csdn.net/mhl29/article/details/51406834
具体代码:
public class TestMain {
public static void main(String[] args) {
Float f = 11.4f;
String s = floatToIEEE754(f);
System.out.println(s);
//将返回的二进制字符串 根据每8位进行分组转换为16进制数据
// 01000001=41
// 00110110=36
// 01100110=66
// 01100110=66
}
/**
* 获取float的IEEE754存储格式
* @param value
* @return
*/
public static String floatToIEEE754(float value) {
//符号位
String sflag = value > 0 ? "0" : "1";
//整数部分
int fz = (int) Math.floor(value);
//整数部分二进制
String fzb = Integer.toBinaryString(fz);
//小数部分,格式: 0.02
String valueStr = String.valueOf(value);
String fxStr = "0" + valueStr.substring(valueStr.indexOf("."));
float fx = Float.parseFloat(fxStr);
//小数部分二进制
String fxb = toBin(fx);
//指数位
String e = Integer.toBinaryString(127 + fzb.length() - 1);
//尾数位
String m = fzb.substring(1) + fxb;
String result = sflag + e + m;
while (result.length() < 32) {
result += "0";
}
if (result.length() > 32) {
result = result.substring(0, 32);
}
return result;
}
private static String toBin(float f) {
List<Integer> list = new ArrayList<Integer>();
Set<Float> set = new HashSet<Float>();
int MAX = 24; // 最多8位
int bits = 0;
while (true) {
f = calc(f, set, list);
bits++;
if (f == -1 || bits >= MAX)
break;
}
String result = "";
for (Integer i : list) {
result += i;
}
return result;
}
private static float calc(float f, Set<Float> set, List<Integer> list) {
if (f == 0 || set.contains(f))
return -1;
float t = f * 2;
if (t >= 1) {
list.add(1);
return t - 1;
} else {
list.add(0);
return t;
}
}
}