2

以下はdouble値です

-1.2316741412499997E8

以下は私が使用している方法です:

Long.toBinaryString(Double.doubleToRawLongBits(-1.2316741412499997E8))
output: 1100000110011101010111011000101011011000011111111111111111111110

ただし、値2で実行しようとすると、次のような出力が得られますが、これは間違っています。

Long.toBinaryString(Double.doubleToRawLongBits(2.0))
output: 100000000000000000000000000000000000000000000000000000000000000

負のdouble値をバイナリに変換する方法を教えてもらえますか。よろしくお願いします。

4

3 に答える 3

5

どのような結果が欲しいかわかりませんが、2.0の結果は絶対に正しいです。

数値にはゼロが埋め込まれていないため、符号ビットが設定されているように見える場合がありますが、ビットセットは指数の最上位ビットであることに注意してください。

于 2012-08-08T06:33:25.917 に答える
4

浮動小数点値(doubleなど)は、整数値とは完全に異なって表されます。整数値から、基数2の同じ数値を表すゼロが埋め込まれた(正の数値の場合)2進数として表されることに慣れています。これは浮動小数点値には当てはまりません。

定義上、浮動小数点値には浮動小数点があります。したがって、2進数は、小数点がどこにあるかに関する情報をエンコードする必要があります。これは、番号を次のように再形成することによって行われます。

(+/-) x * 2^y   whereas 0 <= x < 2 (= 10 base 2)

(+/-)1ビットかかる記号です。x仮数、y指数です。したがって、バイナリ表現は最終的に3つの部分をエンコードする必要があります。

0 <= x < 2、xは常に1.somethingで始まるため、表現に含める1.必要はありません。小数点以下の部分のみが保存され、仮数と見なされます。

あなたの例では、2.0は次のように再形成されています。

+ 1.0 * 2 ^ 1

符号:+仮数:0指数:1

これはたまたま次のように表されます

0 10000000000 0000000000000000000000000000000000000000000000000000

負の数の場合、符号は-です。これは先頭として表され1ます。

1 10000000000 0000000000000000000000000000000000000000000000000000

元の投稿には、先行ゼロが欠落している数値がリストされていることに注意してください。これは、数学的には正しいですが、バイナリ表現をキャプチャしようとすると誤解を招く可能性があります。

  10000000000 0000000000000000000000000000000000000000000000000000 =
0 10000000000 0000000000000000000000000000000000000000000000000000

理解して覚えておくべき詳細がいくつかあります。たとえば、指数も負の値にすることができます。より詳細な説明は、FloatingPointWikipediaの記事にあります。Joachimによって参照されるbinaryconvert.comも、表現を理解するのに役立ちます。

于 2012-08-08T07:02:51.363 に答える
0

これは、あなたの望むことですか?

System.out.println(Long.toBinaryString(Double.valueOf(2.0).longValue()));
System.out.println(Long.toBinaryString(Double.valueOf(-2.0).longValue()));
于 2012-08-08T06:36:45.680 に答える