- ベストアンサー
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 などという、めんどくさいことをやっていたのですが、もっとスマートなやりかたはないでしょうか? コンピュータもいちいちこんなやり方でやっていたら、計算量多すぎてやってられないような気がするので、きっとあると思うんですけど…簡潔なアルゴリズム…
- みんなの回答 (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 …と循環する、の意味)
その他の回答 (6)
- yusuke5111
- ベストアンサー率16% (9/55)
No.3のwogotaさんの回答で、あってると思います。 あえて付け加えるとすれば、 >小数点を含んだ実数の、10進数から2進数への変換のやり方がよくわかりません。できるときとできないときがあります。 とありますが、例であげている(0.1)_10 などは2進数で表せない数の代表的な一例です。 実際、コンピュータでもこれが原因で誤差が出ることがあります。
お礼
ありがとうございました。 >コンピュータでもこれが原因で誤差が出ることがあります。 試してみました。0.00000001490…みたいになりました。 P.S. もし暇で、かつやる気になってくれたら、#3の方が紹介してくれた小数点を含んだ数値の変換アルゴリズムの説明をおねがいします。
補足
※お礼の欄の後記 0.00000001490… → 0.10000001490… のマチガイでした。
- kony0
- ベストアンサー率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=25余り0によって、50枚ある2円玉が4円玉25枚に。 とやっていくと、64円、32円、4円、1円玉が1枚ずつになる。 これを2進数の世界では、(1100101)_2と書く、という感じです。 余りを逆に並べるとよいというのは、こんな仕組みを押さえておけば、詰め込み暗記にはならなくてよいと思います。 小数点の数値については。。。俗っぽい表現は難しいですなぁ。^^;
お礼
うまいっっ! スバラシク解りやすかったです。ありがとうございました。 小数点を含んだ数値はどう理解すればいいんですかね... とりあえず、kony0さんが整数値について説明してくれたアイディアの 方面から自分でもアプローチしてみますけど、今ちょっと考えた限りではとりあえず解らないので、暇でかつ、やる気になってくれたらお願いします。
No.#2のRIO-Freakです。 『10進数and2進数』で検索したら、小数の変換法が載っていました。見てみてください。
- wogota
- ベストアンサー率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 というように、考えることが出来ます。(この方法は、後述の考え方を 逆さにしているだけだったりします。) ということで、割る数を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となります。 かなり、直感を重視した内容になっていますので、理論的な説明が必要ですね。
お礼
回答ありがとうございました。 整数値については、#5の方の説明で理解できたのですが、 小数点を含んだ数値のやり方が理解できません。 できれば説明お願いします。
小数点を含んだ実数の変換は、専門外なのでよくわかりませんが、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で割っていって、余りを下の位から順に立てていきます。
お礼
回答ありがとうございました。 こんなやり方があったのですね。
- yo-kan-62
- ベストアンサー率18% (18/98)
一応コンピュータ屋です。 コンピュータの中では、2進法が先です。 つまり2進数にあわせて、人に優しい10進表記をしているのです。 とりあえずコンピュータの中の話でした。 ではでは。
お礼
回答?ありがとうございました。 あ、そうか。10進数で数値を入力、また表示するときは、わざわざ計算などしなくても1対1に対応(2進数値と10進数値が)してるからいい、というコトですか?
お礼
こここ、これは! まさに目からウロコデス。とってもわかりやすい回答ありがとうございましたー