我确信我缺少一些东西。我使用这段代码:
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(单精度)位序列(除了滚动我自己的,我已经做过)?
感谢名单
答案 0 :(得分:3)
问题是Java中的int
已签名。当您执行Integer.toString(bitsVal, 2);
时,不显示bitsVal
的文字位,您将显示这些位所代表的有符号整数的基数2表示(即{ {1}}会产生Integer.toString((int)0xFFFFFFFF, 2)
)。
但是-1
将该值视为无符号 32位整数,因此应该产生您之后的结果(Integer.toBinaryString(bitsVal)
将生成一个32 1的字符串)。