JAVA中关于float浮点数转换为IEEE754标准4字节16进制数据转换方式

关于解析的具体写法是从一篇文章中摘取下来的
原文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;
    }
}

}

猜你喜欢

转载自blog.csdn.net/qq_43504447/article/details/105823957
今日推荐