2013-02-21 68 views
2

我敢肯定,我错过了一些东西。我使用此代码:在Java中获得(十进制)浮点数的IEEE 754(单精度)表示法

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

这似乎对正数工作正常。我的意思是,字符串必须用0填充以获得整个32位表示,但否则就没问题。

对于exampele为F = 2.085,我得到:

bitsString=100 0000 0000 0101 0111 0000 1010 0100 

(我已经添加了自己的空间为清晰起见,他们是不是真的存在)

这里只有31一和零,因为有第一位是符号位,在这种情况下是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(单精度)位序列(除了滚动我自己的,我已经做到了)?

感谢名单

回答

3

的问题是,int在Java中签署。当你这样做Integer.toString(bitsVal, 2);而不是显示文字位bitsVal,你显示的是这些位代表的有符号整数的基数二表示(即Integer.toString((int)0xFFFFFFFF, 2)会产生-1)。

Integer.toBinaryString(bitsVal)对待值作为无符号 32位整数,所以应产生的结果你后(Integer.toBinaryString((int)0xFFFFFFFF)将产生32 1的字符串)。

相关问题