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

(わかりやすくするために自分でスペースを追加しましたが、実際にはありません)

最初のビットは符号ビット(この場合は0)であるため、1と0は31個しかありません。したがって、32個の要素が得られるまで0を左パッドで埋めても問題ありません。

同じことがf=0.85にも当てはまり、次のようになります。

bitsString=11 1101 1010 1110 0001 0100 0111 1011

これも問題ありません。これは、最初に欠落している2つのビットが0(ここでも符号の場合)であり、正規化された指数の2進表現が01111011であるため0です。

しかし、負の値の場合、私は本当に奇妙な値を取得します。私が理解していることから、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は、それらのビットが表す符号付き整数の基数2の表現を表示しています(つまりInteger.toString((int)0xFFFFFFFF, 2)、を生成し-1ます)。

ただし、値は符号なし32ビット整数Integer.toBinaryString(bitsVal)として扱われるため、目的の結果を生成する必要があります( 32個の1の文字列を生成します)。Integer.toBinaryString((int)0xFFFFFFFF)

于 2013-02-21T11:16:18.167 に答える