2

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

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 个 1 和 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(单精度)位序列(除了滚动我自己的,我已经这样做了)?

谢谢

4

1 回答 1

3

问题是int在 Java 中是签名的。当您这样做时,Integer.toString(bitsVal, 2);没有显示 的​​文字位bitsVal,而是显示这些位表示的有符号整数的以二为底的表示(即Integer.toString((int)0xFFFFFFFF, 2)会产生-1)。

但是Integer.toBinaryString(bitsVal)将该值视为一个无符号的32 位整数,因此应该产生您所追求的结果(Integer.toBinaryString((int)0xFFFFFFFF)将产生一个 32 个 1 的字符串)。

于 2013-02-21T11:16:18.167 回答