• ベストアンサー

10進数 → 2進数

小数点を含んだ実数の、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 などという、めんどくさいことをやっていたのですが、もっとスマートなやりかたはないでしょうか? コンピュータもいちいちこんなやり方でやっていたら、計算量多すぎてやってられないような気がするので、きっとあると思うんですけど…簡潔なアルゴリズム…

noname#4530
noname#4530

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

  • ベストアンサー
  • kony0
  • ベストアンサー率36% (175/474)
回答No.7

小数の場合は、「イメージ」よりも「位取り記数法」で考えたほうが早そうです。 まず、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
質問者

お礼

こここ、これは! まさに目からウロコデス。とってもわかりやすい回答ありがとうございましたー

その他の回答 (6)

回答No.6

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

noname#4530
質問者

お礼

ありがとうございました。 >コンピュータでもこれが原因で誤差が出ることがあります。 試してみました。0.00000001490…みたいになりました。 P.S. もし暇で、かつやる気になってくれたら、#3の方が紹介してくれた小数点を含んだ数値の変換アルゴリズムの説明をおねがいします。

noname#4530
質問者

補足

※お礼の欄の後記 0.00000001490… → 0.10000001490… のマチガイでした。

  • kony0
  • ベストアンサー率36% (175/474)
回答No.5

整数値の変換について、皆さんがすでに書かれている導出式の「イメージ」を極めて俗っぽくかくとこんな感じです。 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さんが整数値について説明してくれたアイディアの 方面から自分でもアプローチしてみますけど、今ちょっと考えた限りではとりあえず解らないので、暇でかつ、やる気になってくれたらお願いします。

noname#1489
noname#1489
回答No.4

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

参考URL:
http://cuvier.center.osakafu-u.ac.jp/lecture99/lecture-7/sld010.htm
  • wogota
  • ベストアンサー率42% (66/154)
回答No.3

題にあるように、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の方の説明で理解できたのですが、 小数点を含んだ数値のやり方が理解できません。 できれば説明お願いします。

noname#1489
noname#1489
回答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 (1100101)_2 というように、2で割っていって、余りを下の位から順に立てていきます。

noname#4530
質問者

お礼

回答ありがとうございました。 こんなやり方があったのですね。

  • yo-kan-62
  • ベストアンサー率18% (18/98)
回答No.1

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

noname#4530
質問者

お礼

回答?ありがとうございました。 あ、そうか。10進数で数値を入力、また表示するときは、わざわざ計算などしなくても1対1に対応(2進数値と10進数値が)してるからいい、というコトですか?

関連するQ&A

  • 2進数の小数計算について

    コンピュータは0と1の2進数で計算しますが、小数点の計算は苦手だと聞いています。 実際、消費税の0.05を2進数で表現することは出来ません。では、どうやってコンピュータで小数点の計算しているのですか?

  • 2進数と10進数の関係について

    浮動小数点で表現されている10進数の0.1を 2進数に変換すると循環小数となります。 これを単純にまた10進数に変換すると 永遠に0.1とはならないと思うのですが、 なぜ、2進数の(0.00011001100110011…)が EXCEL等のアプリケーションで人間の目に見える形で は10進数の(0.1)となっているのでしょうか? IEEEの規格の仕様となにか関係があるのでしょうか?

  • コンピュータ小数点2進数

    ・コンピュータ内で「小数点以下を含む数」をデータとして表現する方法についてまとめよ。 (コンピュータ内で、メモリに記録される0と1の列によって小数点以下を含む数を表すのにどのようなルールが用いられているのか、つまり小数点以下を含む数のためのデータ解釈のルールを問う) このような問題あなたならどう回答を出しますか??

  • 16進数から10進数へ

    (A2.E8)を10進数に変換したいのですが、 162.いくらになるまでは覚えているのですが、 小数点以下の計算を忘れてしまったので分かる方 回答よろしくお願いします。

  • 2進数の0.2?

     10進数の0.2を2進数に変換していったら、循環小数になってしまいました。表せないことはわかったのですが、これをコンピュータはどうやって認識するのでしょうか?  まさか0.2+0.2を「計算できません。」なんて表示するコンピュータはみたことがないし・・・。  ほかに、どうにかして、0.2を2進数で表示する方法ってないんですか?どなたか教えてください。

  • 有理数と無理数について

    「有理数は有限小数または循環小数となり、無理数は循環しない無限小数となることを示せ」という問いに関してアドバイスを下さい。   私的に考えた解答を書いてみます。  有理数とは、mおよびnが整数である時、m/nを有理数と呼ぶ。つまり、有限小数または循環小数が分数であるならば、有理数は有限小数または循環小数と言える。 例えば循環小数A=0.12121212・・・・を分数にする。 (10xA)-A=(12.12121212・・・)-(0.12121212・・・)     9A=12      A=4/3 となり、循環小数Aは分数となり有理数は有限小数または循環小数である。・・・・・どうでしょうか? 「無理数が循環しない無限小数である」というのは実数数において有理数以外のものが無理数だと認識している私は、分数表示できない数は無理数である・・としか示せないので、なんだか上手に表現できません。 アドバイス待ってます。

  • 2進数&10進数&16進数の変換

     ◆ コンピュータで使用される2進数  人が日常使用している数値は10進数ですが、コンピュータは内部で数値を表現する場合、2進数を使用  しています。しかし、「0」と「1」だけの2進数では人が分かりにくいため、人間が見えるところでは  コンピュータは2進数を10進数や16進数が変換して表現しています。ここではその変換方法を学びます。  ◆ 2進数  2進数とは、「0」と「1」の2種類の数字を用いて全ての数を表現します。10進数では0から数えて「9」の  次は位があがることになりますが、2進数では「 1 」の次に位があります。位があがれば、その新しい桁は   「 1 」 となり、それ以下の桁は全て 「 0 」 となります。それでは、2進数の数の増え方を見てみましょう。      ところで、2進数を表現する時は一般的に8桁単位で表現するため、8桁未満の場合は頭に0をつけます。  つまり、上の2進数の値は順番に 00000000 → 00000001 → 00000010 → 00000011 → 00000100 →  00000101 → 00000110 → 00000111 → 00001000 と表します。以下は2進数と10進数の対応表です。 2進数と10進数の対応表 10進数 0 1 2 3 4 5 6 7 8 9 10 ・・・ 2進数 0 1 10 11 100 101 110 111 1000 1001 1010 ・・・  ◆ 2進数から10進数への変換方法  10進数と2進数の対応表は以下の通りです。2進数の桁が上がる時の10進数の値が以下となります。 2進数と10進数の対応表2 10進数 1 2 4 8 16 32 64 128 2進数 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000  従って、2進数で「1」となっている桁に対応する上記の10進数の基準値を合計することにより、2進数から  10進数の値を求めることができます。例えば、2進数の「 00101010 」を10進数に変換する場合、基準値が  32、8、2の所でビットが1なので下図の通り、2進数の「 00101010 」は10進数では「42」だと分かります。            ◆ 10進数から2進数への変換方法  10進数の数値を「 0 」になるまで「 2 」で割り算していき、その結果の「余りの数 」を並べることで  ある10進数の値を2進数の値へ変換することができます。それでは、具体的に変換して見て行きましょう。           例えば、10進数の「160」を2で割り算していくと上図の結果となります。後は、余りの数を下から順番に  並べれば 「 10100000 」 の値が算出されます。次に、「22」を2で割り算していき余りの数を下から順に  並べれば 「 10110 」 の値が算出されます。ネットワークにおいては、2進数を一般的に8桁で表示する  ことから、8桁になるよう上位に「 0 」を追加して「 00010110 」とします。当然「 10110 」と同じ値。 因みにここ参照ですがhttp://www.infraexpert.com/study/ip1.html なぜこれが10進数なんでょうか? 10進数というのは、0から9までの数字が1増えて10になるんですよね? なのに2進数と10進数の対応表2を見ると 倍数になっているのですが、、 これはいったいどういう違いなんでしょうか? 回答お願いいたします。 ほかにも解らなそうな点は、教えて頂けると幸いです。

  • 2進数から16進数への変換

    2進数から16進数への変換はだいたいはできるんですが、小数点の2進数を16進数に変換するやり方がわかりません。 (例) 2進数1001→16進数では9ですが、0.0101などのやりかたがわかりません。 よろしくお願いします

  • 単精度浮動小数点方式、16進数

    10進数で22.75で表される値を単精度浮動小数点方式で表現し,それを16進数に変換するとどうなりますか? 22.75(10)→1.421875 4+127=131=10000011(2) 0.421875=0.011011(2) ここからのやり方教えてください

  • 10進数の14.5を浮動小数点(IEEE754形式)の2進数に変換するにはどうしたらよいでしょうか?

    10進数の14.5を浮動小数点(IEEE754形式)の2進数に変換するにはどうしたらよいでしょうか? 10進数の-7.5を浮動小数点(IEEE754形式)の2進数に変換するにはどうしたらよいでしょうか? 計算方法を教えてください。