public static void main(String[] args) {
//40a80000
long l =Long.parseLong("40a80000",16);
String d = Long.toBinaryString(l);
System.out.println(BinaryStringToFloat(d));
}
static float BinaryStringToFloat(final String binaryString) {
// float是32位,将这个binaryString左边补0补足32位,如果是Double补足64位。
final String stringValue = LeftPad(binaryString, '0', 32);
// 首位是符号部分,占1位。
// 如果符号位是0则代表正数,1代表负数
final int sign = stringValue.charAt(0) == '0' ? 1 : -1;
// 第2到9位是指数部分,float占8位,double占11位。
final String exponentStr = stringValue.substring(1, 9);
// 将这个二进制字符串转成整数,由于指数部分加了偏移量(float偏移量是127,double是1023)
// 所以实际值要减去127
final int exponent = Integer.parseInt(exponentStr, 2) - 127;
// 最后的23位是尾数部分,由于规格化数,小数点左边隐含一个1,现在加上
final String mantissaStr = "1".concat(stringValue.substring(9, 32));
// 这里用double,尽量保持精度,最好用BigDecimal,这里只是方便计算所以用double
double mantissa = 0.0;
for (int i = 0; i < mantissaStr.length(); i++) {
final int intValue = Character.getNumericValue(mantissaStr.charAt(i));
// 计算小数部分,具体请查阅二进制小数转10进制数相关资料
mantissa += (intValue * Math.pow(2, -i));
}
// 根据IEEE 754 标准计算:符号位 * 2的指数次方 * 尾数部分
return (float) (sign * Math.pow(2, exponent) * mantissa);
}
static String LeftPad(final String str, final char padChar, int length) {
final int repeat = length - str.length();
if (repeat <= 0) {
return str;
}
final char[] buf = new char[repeat];
for (int i = 0; i < buf.length; i++) {
buf[i] = padChar;
}
return new String(buf).concat(str);
}
16进制转浮点
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 之前想自己写一个UIColor的分类,实现可以输入十六进制字符串(例如:0xff8ac)的颜色值来设置方便的设置颜...
- var id = 128;var id_8B = alarm_id & 0x000000ff;var id_16B...
- 在这篇文章中我们将以数字263.3为例 第一步:将整数部分以二进制形式表达 数字263.3的整数部分为263 2 ...
- 最近用到了socket, 在发送数据的时候遇到了问题 所以拿出来分享下。 由于服务器需要 8位数 byte数组 ...