在Java中获得(十进制)float的IEEE 754(单精度)表示

时间:2013-02-21 11:10:45

标签: java bit ieee-754

我确信我缺少一些东西。我使用这段代码:

int bitsVal = Float.floatToIntBits(f);
String bitsString = Integer.toString(bitsVal, 2);

这似乎对正数很好。我的意思是,字符串必须用零填充以获得整个32位表示,但除此之外,它很好。

例如,对于f = 2.085,我得到:

bitsString=100 0000 0000 0101 0111 0000 1010 0100

(为了清晰起见,我自己添加了这些空格,但它们并不存在)

那里只有31个零和0,因为第一个位是符号位,在这种情况下是0,所以如果我只是用0填充它直到我得到32个元素就可以了。

f = 0.85同样如此:

bitsString=11 1101 1010 1110 0001 0100 0111 1011

再次没问题,因为2个第一个缺失位为0(同样,对于符号),再次为0,因为归一化指数的二进制表示为01111011。

但对于负值,我会得到非常奇怪的价值观。根据我的理解,如果f的给定正值给出了0xxxxxx的IEEE 754(单精度)表示(0后跟归一化指数和尾数的31位),那么负f将返回相同的序列,除了第一位在左边,从0变为1。

但是使用上面的代码,对于f = -0.85,我得到了

bitsString = -100 0010 0101 0001 1110 1011 1000 0101

其中,除了“ - ”(减去字符),应该是“1”(我猜)有奇怪的值。

所以我的问题是,有没有办法,使用Java API获取给定浮点数的IEEE 754(单精度)位序列(除了滚动我自己的,我已经做过)?

感谢名单

1 个答案:

答案 0 :(得分:3)

问题是Java中的int已签名。当您执行Integer.toString(bitsVal, 2);时,显示bitsVal的文字位,您将显示这些位所代表的有符号整数的基数2表示(即{ {1}}会产生Integer.toString((int)0xFFFFFFFF, 2))。

但是-1将该值视为无符号 32位整数,因此应该产生您之后的结果(Integer.toBinaryString(bitsVal)将生成一个32 1的字符串)。