OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

10進数 → 2進数

  • 暇なときにでも
  • 質問No.149081
  • 閲覧数513
  • ありがとう数9
  • 気になる数0
  • 回答数7
  • コメント数0

小数点を含んだ実数の、10進数から2進数への変換のやり方がよくわかりません。できるときとできないときがあります。たとえば、

(0.1)_10 = (0.0001100110011・・・)_2

※(A)_xとは、数値Aのx進数表現というイミです。以下もこの表現を使います。

となるらしいですが、どうやればいいのでしょうか?わかりません。

また、ついでに聞いておきたいことがもう一つあります。小数点を含まない数値の
変換も教えていただきたいです。

たとえば今までぼくは、(101)_10を2進数に変換するのに、

(101)_10 = (100 + 1)_10 = ( 2^2・25 + 1 )_10

= ( 2^2・( 2^3・(2 + 1) + 1 ) +1 )_10 = (2^6 + 2^5 + 2^2 + 2^0 )_10

= (1100101)_2

などという、めんどくさいことをやっていたのですが、もっとスマートなやりかたはないでしょうか?
コンピュータもいちいちこんなやり方でやっていたら、計算量多すぎてやってられないような気がするので、きっとあると思うんですけど…簡潔なアルゴリズム…
通報する
  • 回答数7
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.7
レベル11

ベストアンサー率 36% (175/474)

小数の場合は、「イメージ」よりも「位取り記数法」で考えたほうが早そうです。

まず、2進数→10進数のほうが考えやすいのでこちらから。
(0.101)_2を10進数に直すといくらになるかはおわかりですか?
答えは、1*(1/2) + 0*(1/4) + 1*(1/8) = 5/8 です。

(表記として適当ではないですが)ある2進数を(0.abcdef...)_2と文字置きすると、
(0.abcdef...)_2 = a/2 + b/4 + c/8 + d/16 + e/32 + f/64 + …

この両辺をおもむろに2倍すると、右辺から考えて
a +( b/2 + c/4 + d/8 + e/16 + …) = a_2 + (0.bcdef...)_2 = (a.bcdef...)_2 です。

回りくどい説明ですが、これは「2進数では値を2倍すると位が1つずれる」という説明そのものです。

#3でwogotaさんが書かれた求め方についての解釈は次のとおりです。(ていうか文字で書いただけやけど^^;)

(0.1)_10 = (0.abcdefg...)_2とおくと、
両辺2倍 (0.2)_10=(a.bcdefg...)_2 よりa=0
両辺2倍 (0.4)_10=(b.cdefgh...)_2 よりb=0
両辺2倍 (0.8)_10=(c.defghi...)_2 よりc=0
両辺2倍 (1.6)_10=(d.efghij...)_2 よりd=1, (0.6)_10=(0.efghij...)_2
両辺2倍 (1.2)_10=(e.fghijk...)_2 よりe=1, (0.2)_10=(0.fghijk...)_2

ここで、(0.bcdefg...)_2 = (0.fghijk...)_2 より
f=b, g=c,... と循環することが読みとれます。

即ち(0.1)_10 = (0.0<0011>)_2(<0011>とは 0011 0011 0011 …と循環する、の意味)
お礼コメント
noname#4530

こここ、これは!

まさに目からウロコデス。とってもわかりやすい回答ありがとうございましたー
投稿日時 - 2001-10-12 23:53:29
-PR-
-PR-

その他の回答 (全6件)

  • 回答No.2

小数点を含んだ実数の変換は、専門外なのでよくわかりませんが、10進数の整数を2進数に変換する場合には、 101÷2=50 余り 1 (1)_2 50÷2=25 余り 0 (01)_2 25÷2=12 余り 1 (101)_2 12÷2=6 余り 0 (0101)_2 6÷2=3 余り 0 (00101)_2 3÷2=1 余り 1 (100101)_2 1÷2=0 余り 1 (110010 ...続きを読む
小数点を含んだ実数の変換は、専門外なのでよくわかりませんが、10進数の整数を2進数に変換する場合には、

101÷2=50 余り 1 (1)_2
50÷2=25 余り 0 (01)_2
25÷2=12 余り 1 (101)_2
12÷2=6 余り 0 (0101)_2
6÷2=3 余り 0 (00101)_2
3÷2=1 余り 1 (100101)_2
1÷2=0 余り 1 (1100101)_2

というように、2で割っていって、余りを下の位から順に立てていきます。
お礼コメント
noname#4530

回答ありがとうございました。

こんなやり方があったのですね。
投稿日時 - 2001-10-12 00:22:03

  • 回答No.1
レベル9

ベストアンサー率 18% (18/98)

一応コンピュータ屋です。 コンピュータの中では、2進法が先です。 つまり2進数にあわせて、人に優しい10進表記をしているのです。 とりあえずコンピュータの中の話でした。 ではでは。 ...続きを読む
一応コンピュータ屋です。

コンピュータの中では、2進法が先です。

つまり2進数にあわせて、人に優しい10進表記をしているのです。

とりあえずコンピュータの中の話でした。

ではでは。
お礼コメント
noname#4530

回答?ありがとうございました。

あ、そうか。10進数で数値を入力、また表示するときは、わざわざ計算などしなくても1対1に対応(2進数値と10進数値が)してるからいい、というコトですか?
投稿日時 - 2001-10-12 00:28:58
  • 回答No.3
レベル10

ベストアンサー率 42% (66/154)

題にあるように、101_10について考えてみましょう。 101=1×10^2+0×10^1+1×10^0 (^は、べき乗とします。つまり、10^2=10×10=100) というように、数字を分解できます。 また、これらの数字を1つずつ求めるとした場合、 101÷10=10余り1 10÷10=1余り0 1÷10=0余り1 というように、考えることが出来ます。(この方法は、後述の考え方を 逆 ...続きを読む
題にあるように、101_10について考えてみましょう。
101=1×10^2+0×10^1+1×10^0
(^は、べき乗とします。つまり、10^2=10×10=100)
というように、数字を分解できます。
また、これらの数字を1つずつ求めるとした場合、
101÷10=10余り1
10÷10=1余り0
1÷10=0余り1
というように、考えることが出来ます。(この方法は、後述の考え方を
逆さにしているだけだったりします。)

ということで、割る数を2にすると、余りの数字から2進数に出来ます。
101÷2=50余り1
50÷2=25余り0
25÷2=12余り1
12÷2=6余り0
6÷2=3余り0
3÷2=1余り1
1÷2=0余り1
から、101_10=1100101_2となります。
小数点では、割る数ではなく掛ける形で表示できます。
0.1_10を例にしましょう。
0.1×2=0.2(1以下ということで0)
0.2×2=0.4(1以下ということで0)
0.4×2=0.8(1以下ということで0)
0.8×2=1.6(1以上なので、1。1.6-1=0.6)
0.6×2=1.2(1以上なので、1。1.2-1=0.2)
と言う風に、0を1つおいて"0011"の列が循環する表示になります。
よって、0.1_10=0.0001100110011・・・_2となります。

かなり、直感を重視した内容になっていますので、理論的な説明が必要ですね。
お礼コメント
noname#4530

回答ありがとうございました。

整数値については、#5の方の説明で理解できたのですが、
小数点を含んだ数値のやり方が理解できません。
できれば説明お願いします。
投稿日時 - 2001-10-12 00:19:35
  • 回答No.4

No.#2のRIO-Freakです。 『10進数and2進数』で検索したら、小数の変換法が載っていました。見てみてください。 ...続きを読む
No.#2のRIO-Freakです。

『10進数and2進数』で検索したら、小数の変換法が載っていました。見てみてください。
  • 回答No.5
レベル11

ベストアンサー率 36% (175/474)

整数値の変換について、皆さんがすでに書かれている導出式の「イメージ」を極めて俗っぽくかくとこんな感じです。 2進数の世界の人達は、1円玉が2枚たまると2円玉1枚と交換できます。(次の位に進むということ) 同様に2円玉2枚で4円玉に、4円玉2枚で8円玉に。。。となります。 よって、1円玉101枚を持っている状態から、 101÷2=50余り1 によって、2円玉50枚と1円玉1枚 50÷2=2 ...続きを読む
整数値の変換について、皆さんがすでに書かれている導出式の「イメージ」を極めて俗っぽくかくとこんな感じです。

2進数の世界の人達は、1円玉が2枚たまると2円玉1枚と交換できます。(次の位に進むということ)
同様に2円玉2枚で4円玉に、4円玉2枚で8円玉に。。。となります。

よって、1円玉101枚を持っている状態から、
101÷2=50余り1 によって、2円玉50枚と1円玉1枚
50÷2=25余り0によって、50枚ある2円玉が4円玉25枚に。
とやっていくと、64円、32円、4円、1円玉が1枚ずつになる。
これを2進数の世界では、(1100101)_2と書く、という感じです。

余りを逆に並べるとよいというのは、こんな仕組みを押さえておけば、詰め込み暗記にはならなくてよいと思います。

小数点の数値については。。。俗っぽい表現は難しいですなぁ。^^;
お礼コメント
noname#4530

うまいっっ!
スバラシク解りやすかったです。ありがとうございました。

小数点を含んだ数値はどう理解すればいいんですかね...
とりあえず、kony0さんが整数値について説明してくれたアイディアの
方面から自分でもアプローチしてみますけど、今ちょっと考えた限りではとりあえず解らないので、暇でかつ、やる気になってくれたらお願いします。
投稿日時 - 2001-10-12 00:15:13
  • 回答No.6
レベル8

ベストアンサー率 16% (9/55)

No.3のwogotaさんの回答で、あってると思います。 あえて付け加えるとすれば、 >小数点を含んだ実数の、10進数から2進数への変換のやり方がよくわかりません。できるときとできないときがあります。 とありますが、例であげている(0.1)_10 などは2進数で表せない数の代表的な一例です。 実際、コンピュータでもこれが原因で誤差が出ることがあります。 ...続きを読む
No.3のwogotaさんの回答で、あってると思います。

あえて付け加えるとすれば、
>小数点を含んだ実数の、10進数から2進数への変換のやり方がよくわかりません。できるときとできないときがあります。
とありますが、例であげている(0.1)_10 などは2進数で表せない数の代表的な一例です。
実際、コンピュータでもこれが原因で誤差が出ることがあります。
補足コメント
noname#4530

※お礼の欄の後記

0.00000001490… → 0.10000001490… のマチガイでした。
投稿日時 - 2001-10-12 00:40:42
お礼コメント
noname#4530

ありがとうございました。

>コンピュータでもこれが原因で誤差が出ることがあります。
試してみました。0.00000001490…みたいになりました。

P.S.
もし暇で、かつやる気になってくれたら、#3の方が紹介してくれた小数点を含んだ数値の変換アルゴリズムの説明をおねがいします。
投稿日時 - 2001-10-12 00:39:41
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ