使用 Float 类 节省开发时间

即使你可能知道 IEEE 浮点数,你可能也从来没有逐个比特地处理过这类数据。下面我将向你展示如何逐个比特地处理 IEEE 浮点数,下次在你的 Java 项目需要从比特序列创建浮点数时,或者从浮点数创建比特序列时,你就知道Float 类可以为完成这一工作。

IEEE 浮点数介绍

IEEE 754 浮点单精度数字格式定义了一个用于存储浮点数的比特布局。在空比特布局中,一个比特留作符号位,八个比特留作指数,23个比特留作尾数。这些比特是按最重要比特到最不重要比特进行排列的,如下例所示:

31                             0
|                              |                      
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM

其中:

S = 符号位
E = 指数
M = 尾数

你可以从 IEEE 的站点购买一份 IEEE 浮点数的完整解释。(如果在线搜索 IEEE 754,你应该可以找到免费的版本。)

Float 对 Java 社区的贡献

下面的示例程序使用 Float 的两个方法将一个浮点数转成比特,然后又将这些比特转成一个浮点数。

使用Float.floatToIntBits(float f) 方法可以将一个浮点数转成一个比特序列。这个方法返回一个32位整数,表示你作为参数提供的浮点数的 IEEE 754 比特排列。

使用Float.intBitsToFloat(int bits) 方法可以进行反方向转换。这个方法接受传入的整数作为参数,将这些比特转成一个 IEEE 浮点数。

下面是示例程序:

public class BitsTip {
    public static void main(String args[]) {
        float f = Float.parseFloat(args[0]);
        int bits = Float.floatToIntBits(f);

        System.out.println("bits: " + bits);
        System.out.println("back to float: " + Float.intBitsToFloat(bits));
    }
}

如果你曾经必须要手工进行这种转换,那么你就会很欣赏这两个简单的方法为你节省的工作。如果你正在处理64位数,那么可以选择使用Double 包装器(wrapper)类。这个类提供同样的方法处理IEEE 754 双精度浮点数。

最好选择阅读一下javadoc,查阅里面有关浮点数与比特序列之间的转换的部分,以便完整地了解这些方法都能为你些做什么。




public static int floatToIntBits(float value) 

根据 IEEE 754 的浮点“单一形式”中的位布局,返回指定浮点值的表示形式。 
第 31 位(掩码 0x80000000 选定的位)表示浮点数字的符号。第 30-23 位(掩码 0x7f800000 选定的位)表示指数。第 22-0 位(掩码 0x007fffff 选定的位)表示浮点数字的有效位数(有时也称为尾数)。 
如果参数为正无穷大,则结果为 0x7f800000。 
如果参数为负无穷大,则结果为 0xff800000。 
如果参数为 NaN,则结果为 0x7fc00000。 
在所有情况下,结果都是一个整数,在将其赋予 intBitsToFloat(int) 方法时,将生成一个与 floatToIntBits 的参数相同的浮点值(除所有 NaN 值被折叠成一个“规范的”NaN 值之外)。 

另外需要知道的是,float类型占用4个字节,从最低位(最右边)到最高位(最左边)的编号是从0-31。这样的话,上面的解释就容易看懂了。也就是说,转换成的32个0、1字符串中,31号表示符号,30-23表示指数,22-0表示尾数。 
------解决方案--------------------------------------------------------
按照IEEE 754标准,32位浮点数在计算机中二进制存储形式共三部分:S(1位,符号) E(8位,阶码) M(23位,尾数) 
给你举个例子吧,Float.floatToIntBits(20.5f)按照如下方式计算: 
20.59D=10100.1B=1.01001*2^4B 指数e=4 
S=0--> 正数 E=4+127=131D=10000011B--> 真实指数e变成阶码E时需加127 M=01001B 
则32位2进制存储形式为:0 10000011 01001000000000000000000 
转换成10进制即1101266944 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值