我只是想知道如何使用位操作来实现目标:给定一个真实的IEEE二进制表示,例如40AC0000
(十进制5.375),如何获得其真正的二进制表示(期待{ Java中的例子{1}}
答案 0 :(得分:1)
这是一个棘手的问题,特别是如果您还不了解IEEE浮动。
由于您的号码中有4个字节,因此它是单精度。这意味着它具有1个符号位,8个指数位和23个尾数位的结构。标志位很明显。指数位的含义会影响您如何解释尾数位。首先检查8个指数位。如果它们都是0,则表示非规格化数字;如果它们都是1,则表示无穷大或NaN;否则,它会正常化。
在规范化中,取指数位,将其解释为8位数,并从中减去127_10(或0xf7)。这是你的指数。然后取剩余的尾数位,加上前导1.你的结果是(-1)^ [符号] * 1. [尾数] * 2 ^ [指数]。
如果是非规范化数字,则指数为-126(1-127)。在这种情况下,解释为(-1)^ [Sign] * 0. [尾数] * 2 ^ [指数]。
在其余情况下,如果尾数全为0,则您的数字为(-1)^ [符号] *无穷大。否则,你的浮动是NaN。
希望有所帮助。
答案 1 :(得分:0)
你的意思是Float.floatToIntBits()和Float.intBitsToFloat()?
答案 2 :(得分:0)
“真正的二进制表示”是什么意思?关于十六进制表示(40AC0000)没有任何“不真实”。
您可以使用Integer:
上的方法在不同的基数(十六进制,二进制,十进制)之间进行转换Float.floatToIntBits(new Float("5.375"));
// = 1085014016
Integer.toString(1085014016, 16);
// = "40ac0000"
Integer.valueOf("40AC0000", 16);
// = 1085014016
Integer.toString(1085014016, 2);
// returns 1000000101011000000000000000000