2進数、10進数、16進数の変換方法とは?

このQ&Aのポイント
  • コンピュータで使用される2進数は、0と1の数字を使用して数値を表現します。
  • 2進数を10進数や16進数に変換して表現することで、人間が理解しやすくなります。
  • 2進数から10進数への変換では、2進数と10進数の対応表を利用します。
回答を見る
  • ベストアンサー

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を見ると 倍数になっているのですが、、 これはいったいどういう違いなんでしょうか? 回答お願いいたします。 ほかにも解らなそうな点は、教えて頂けると幸いです。

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

  • ベストアンサー
回答No.7

No2, No5です。 申し訳ございません。 「9641」はただの例としてあげた数字でした。 割った値の余りを下から読み上げる手法は、 10進数の数字を、n進数に変換する際に使われます。 以下は例といたしまして、 10進数の数字「7564」をn進数に変換することを考えて見ます。 変換する場合、基数[n]で割ることによる余りを読み上げていく形となりますので、 以下のような計算手順が出来上がります。 ==================== 「n = 2」 ★10進数 -> 2進数 7564 / 2 = 3782 ... 0 3782 / 2 = 1891 ... 0 1891 / 2 = 945 ... 1 945 / 2 = 472 ... 1 472 / 2 = 236 ... 0 236 / 2 = 118 ... 0 118 / 2 = 59 ... 0 59 / 2 = 29 ... 1 29 / 2 = 14 ... 1 14 / 2 = 7 ... 0 7 / 2 = 3 ... 1 3 / 2 = 1 ... 1 1 / 2 = 0 ... 1 下から読み上げると、 1110110001100(2) = 7564(10) となります。 ==================== 「n = 8」 ★10進数 -> 8進数 7564 / 8 = 945 ... 4 945 / 8 = 118 ... 1 118 / 8 = 14 ... 6 14 / 8 = 1 ... 6 1 / 8 = 0 ... 1 下から読み上げると、 16614(8) = 7564(10) となります。 なぜこのような計算で結果がでるのか? 不思議ですよね。 ならば、上記要領で、 「n = 10」で、10進数の整数を10進数に変換してみましょう。 ==================== 「n = 10」 ★10進数 -> 10進数 7564 / 10 = 756 ... 4 756 / 10 = 75 ... 6 75 / 10 = 7 ... 5 7 / 10 = 0 ... 7 下から読み上げると、 7564(10) = 7564(10) となります。 ... 数字は基数で割ることで余りは常に、 最下位の桁の数字となることになることに気付きましたでしょうか? 10進数->10進数の変換は、結果としては無意味なことですが、 その数字が導き出される手順は2進数、8進数の変換でも同様のメカニズムとなります。 当たり前といえば当たり前のことですが、 何回も見ていれば、その当たり前に気付けるかと思います。

aiueo6391
質問者

お礼

回答ありがとうございます。 ようやく解りました。

その他の回答 (7)

  • t-aka
  • ベストアンサー率36% (114/314)
回答No.8

回答No.1です。 10進数→2進数の変換について、 文字で説明するよりも、wikipediaにわかりやすく記載されています。 https://ja.wikipedia.org/wiki/%E4%BA%8C%E9%80%B2%E6%B3%95 【十進法から二進法への変換方法】を参照ください。 最初の割り算は0ビット目、次の割り算は1ビット目、といった具合に続きます。 最後の割り算は最上位のビットなので、 最上位のビットから順番に並べていきます。

aiueo6391
質問者

お礼

回答ありがとうございます。 ようやく解りました。

  • OKWavex
  • ベストアンサー率22% (1222/5383)
回答No.6

>2進数と10進数の対応表2を見ると倍数になっているのですが、 >これはいったいどういう違いなんでしょうか? 対応表2はすべての2進数ではなく、001、010、100・・・といった各桁に対応する10進数のみを抜き出したものです 10進数が桁が上がると10倍になるのに対し、2進数は桁が上がると2倍になるので、各桁のみを取り出した10進数は倍数になっているのです ちなみに各桁の値は10進数では10、10x10、10x10x10、10x10x10x10・・・と増えていくのに対し、2進数では2、2x2、2x2x2、2x2x2x2・・・と増えていきます

aiueo6391
質問者

お礼

回答ありがとうございます。 ようやく解りました。

回答No.5

> 回答ありがとうございます。 > あと一つ疑問点があるので質問させていただきます。 > > 10進数から2進数への変換方法で余りの数を出していき、下から順に > 101000とか余った数と余らなかった数で順に読んでいき2進数に変換する方法ですが、なぜあれは、下から読んでいくのでしょうか? > その理屈が解りません。 No2です。 解らないならば、全て、10進数で置き換えて考えてみましょう。 (10進数の数値を10進数で分解) 「9641」 9641 / 10 = 964 ... 1 964 / 10 = 96 ... 4 96 / 10 = 9 ... 6 9 / 10 = 0 ... 9 下からつなげると、「9641」になります。 余りに出てくる値は常に、一番下位の桁が出てくる形となります。 この理屈と全く同じ理論を、2進数、16進数でも当てはめることが可能です。

aiueo6391
質問者

お礼

回答ありがとうございます。 そもそもこの9641という数字はどこから出てきたのでしょうか? かけるの場合は、上から読み上げて 余りの場合は、下から読んで これも計算の法則が解ればわかる事なんでしょうか?

回答No.4

No.3です。 1バイトを4ビットと書いてしまいましたが、記述間違いです。 正しくは、1バイトは8ビットです。

aiueo6391
質問者

お礼

回答ありがとうございます。 ようやく解りました。

回答No.3

>10進数というのは、0から9までの数字が1増えて10になるんですよね? まあそのとおりなんですが、対応表では、10進数の1~10に対応する2進数が表化されていますが、対応表2では、単純に2進数で繰り上がった値における場合の10進数を表化しているだけのことです。 なので、当然、10進数の1~10に相当する2進数は対応表1と全く同じです。 10進数表記値が変われば2進数表記値も変わる。 たったこれだけのことですよ。 どうしても納得出来ないって時は、パッと閃いた10進数を2進数に変えてみればわかります。 その逆も同じで、閃いた2進数の値を10進数に変えてみても全く同じ結果が得られますよ。 >ネットワークにおいては、2進数を一般的に8桁で表示する これは、間違った捉え方です。 これはネットワークだけに限らず、コンピュータの計算において、2進数表記はすべて4桁区切りで表記します。(一部3桁区切りを得意としているコンピュータもありますが) なぜ、2進数表記を4桁区切りで表すかについてですが、コンピュータは、「バイト単位で処理をしているから」というのがそもそもの回答になってしまいますが・・・ じゃあ「バイト」ってなによ?ってことになると思います。 「バイト」というのは、コンピュータが計算処理を行う最小単位になります。そして、このバイトは、4ビットで構成されています。つまり、2進数でいうところの「0」や「1」が入っているところをビットといい、これが4つ集まって、1バイトとなります。 つまり、 10進数(22)=2進数(00010110)=8ビット=2バイト ということになります。 CPUの主記憶装置やHDD、FDD、メモリなどの外部記憶装置の容量にバイトが使われているのも、同じ意味になりますが、この場合は少し違っていて、記憶装置へ情報を書き込む場合、そのエリア(ビット)に情報があるのかないのかという事を書き込んでいます。つまり2進数ですね。当然ながら、情報がある場合は「1」、ない場合は「0」が書き込まれます。 こうして情報を書き込んでいく場合、先にも書きましたが、コンピュータはバイト単位で処理を行うため、コンピュータが計算間違いをしないように最小容量は1バイトにしなければなりません。こういう制約があるから2進数は4桁区切りで表記しなければならないわけなのです。そして、なぜ4桁区切りなのかというと、1バイト=4ビットなわけですから4桁となるわけです。 ちなみに16進数で表記されている値を2進数で表すときには桁の値を4桁ごとに表します。16進数の1桁当たりの値を2進数に表記しなおす場合、8桁になります。 例えば、16進数「F」を2進数で表記すると「1111」になり、10進数に表記すると「15」になります。 もう一つやってみると、16進数(A5)を2進数に表すと「10100101」となり、10進数に表すと「165」になります。この場合の計算法は、まず「A」を2進数「1010」で表し、次に「5」を2進数「0101」で表したものをくっつけるというやり方が最も楽なやり方です。 本来の16進数→2進数の換算法とは違いますが、楽なやり方で計算しても換算法で計算しても同じ結果になるのですから、理解しやすい方法で換算すると良いでしょう。 脱線させて、参考までに・・・ ゲーム等で「フラグが立つ」という言い方をしますが、これは、1ビット単位の2進数でいうところの「0」が「1」になる事から来ている言葉で、もっとわかりやすく説明すると、「旗揚げゲーム」というものをやったことがあると思います。「白あげて、赤上げて~」ってゲームです。 このゲームでも同じことがいえますが、「白旗」が1ビット、「赤旗」が別の1ビットとした場合、「旗が上がっていない」場合のビット値は「0」であり、「旗が上がっている」場合のビット値は「1」として考えます。 C言語のBOOL型や、VBやJavaのBoolean型は、このビット値のことを指していると考えてもいいでしょう。 BOOL型やBoolean型は、TRUEやFALSEという論理値で表されますが、これを2進数に表すと、 TRUE=1(または-1) FALSE=0 となります。TRUEの「-1」というものは、2進数「1」に加えて負のフラグメント(ー)を足しただけの事で、絶対値は「1」ですから同じ意味になります。 2進数がなぜこうなるのかっていうのは、コンピュータがどういう性格を持っているのかに深く関わっています。 ネットワークだからこうだと誤った認識をしていると、コンピュータがどう処理をするのかがわからなくなってしまいますから、正しい認識を心がけるようにしたほうが良いです。 もちろん、コンピュータですから、PCでもコンピュータネットワークでも、電話でもFAXでも携帯でも、PS4などのゲーム機でも全く同じ考え方です。もっといえば、無線機だってコンピュータで処理されますからPCと同じ考え方です。 また、なぜこの2進数が生まれたのかというと、元々コンピュータは、真空管で計算をしていました。更にいえばコンピュータは軍事的産物の1つだったんですね。 真空管ですから、1つの真空管ではビットでの処理しかされません。ビット処理だと、成否判定しかできないわけです。これに文字判定や計算判定、暗号処理などが加わると、とてもじゃないけど処理なんてしきれませんでした。また、人間がよく使う10進数だと、暗号化した場合に簡単に解読されてしまいます。そこで考えだされたのが8進数や16進数といったものです。ただ、8進数は文字判定にはあまり相性が良くなく、計算しようにも8進数は3桁表示になってしまい、ビット計算に於いて割り切れない事が起こってくるため、コンピュータとしても相性は良くありませんでした。そこで今現在主流となっている16進数を用いることになったのです。16進数は2進数やコンピュータとも相性がよく、この16進数の1桁は2進数で4桁で表されることから、1バイトという単位が開発されました。 このことから、コンピュータにおける2進数表記は4桁で表すように統一され、真空管から半導体に変わった現在のコンピュータにおいても当時の考え方が使われているということになります。 ちなみに8進数は使われていないのかというと、使われています。 主に数値計算用コンピュータに於いて使用されています。言語でいうと「FORTRAN」が8進数計算を得意としています。 また、アポロ時代のNASAは16進数ではなく8進数で距離、時間などの計算をしていたようです。 映画「アポロ13」や「ライト・スタッフ」、また、日本では廃盤になってしまいましたが、米国ドラマ「From the Earth」では8進数計算をしているシーンもありますよ。 「From the Earth」というドラマは、米国の宇宙開発をドラマ化したものです。

aiueo6391
質問者

お礼

回答ありがとうございます。 ようやく解りました。

回答No.2

10進数で考えると、「10」は基数と呼ばれるベースとなる数字です。 8進数で考えると、「8」が基数に、16進数で考えると、「16 (=F) 」が基数となります。 全ての進数の計算は基数を元に計算されます。 「9621」という数字について考えましょう。 10進数ですと、「基数」は10です。 それぞれの桁には、「重み」と呼ばれるものがあり、 それぞれ、基数の累乗となります。 --------------- 10^0 = 1 10^1 = 10 10^2 = 100 10^3 = 1000 --------------- 1の位から見ていくと、 9621の表現は、 (9 * 10^3) + (6 * 10^2) + (2 * 10^1) + (1 * 10^0) =(9 * 1000) + (6 * 100) + (2 * 10) + (1 * 1) =9000 + 600 + 20 + 1 =9621 となります。 この概念は2進数、8進数でも当てはめることができます。 二進数の場合、基数は「2」となりますので、 以下の桁の「重み」は以下の通りとなります。 --------------- 1桁目:2^0 = 1 2桁目:2^1 = 2 3桁目:2^2 = 4 4桁目:2^3 = 8 5桁目:2^4 = 16 6桁目:2^5 = 32 --------------- 11011を見ると、 (1 * 2^4) + (1 * 2^3) + (0 * 2^2) + (1 * 2^1) + (1 * 2^0) =(1 * 16) + (1 * 8) + (0 * 4) + (1 * 2) + (1 * 1) =16 + 8 + 0 + 2 + 1 =27 となります。 2進数の計算が、2倍ずつになっているのは、この「重み」が「基数」の累乗で決まる原則なため、 2進数ではたまたま、2倍ずつになっているからとなります。

aiueo6391
質問者

お礼

回答ありがとうございます。 あと一つ疑問点があるので質問させていただきます。 10進数から2進数への変換方法で余りの数を出していき、下から順に 101000とか余った数と余らなかった数で順に読んでいき2進数に変換する方法ですが、なぜあれは、下から読んでいくのでしょうか? その理屈が解りません。

  • t-aka
  • ベストアンサー率36% (114/314)
回答No.1

二つ目の表で言いたいことは、本文を引用すると 『【2進数の桁が上がる時】の10進数の値が以下となります。』 2進数と10進数のひも付ではなく(それは最初の表で説明している)、 繰り上がるときの挙動だけを抽出して示したものです。 2進数の桁数を8ビットで表現していること以外は、同じことを繰り返し書いています。 <見方を変えると、ほら。  2進数で1が一つ左にずれると、10進数は2倍になるよね。> そういったことを作者は暗に示しているのでしょう。 最初の表が理解できれば十分だと考えます。

aiueo6391
質問者

お礼

回答ありがとうございます。 あと一つ疑問点があるので質問させていただきます。 10進数から2進数への変換方法で余りの数を出していき、下から順に 101000とか余った数と余らなかった数で順に読んでいき2進数に変換する方法ですが、なぜあれは、下から読んでいくのでしょうか? その理屈が解りません。           

関連するQ&A

  • 2進数の重み対応表について

    度々すみません。ご協力お願いします。 2進数から8進数への変換ですが以下の2進数重み対応表の意味がいまいち分かりません。 問題: 2進数 1100.01の8進数への変換を次の手順で行う。 (1)3桁づつ区切る: (2)2進数の重み: (3)掛けて足す: (4)8進数: 001 100 . 010 ※3桁無い場合は0を補う 421 421 . 421 ←2進数重み対応表 001 400 . 020 ※掛けて足す 回答:14.1 質問: a.少数以下の重み対応表.421の意味が不明です。  (10進法だと、.10^-1, 10^-2・・・は分かりましたが・・) b.同様に2進数から16進数の場合の小数以下.8421も不明です。 簡単な質問かもしれませんが何卒宜しくご教授お願いします。

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

  • 基数変換の変換につきまして

    現在基本情報技術者の勉強をしています。 10進数から2進数への変換など基数変換がよくわかりません。 10進数の数値を 「 0 」 になるまで 「 2 」 で割り算していき、その結果の「余りの数 」を並べることによりある10進数の値を2進数の値へ変換することができることは分かるのですが、 どういう仕組みでそのようにしたら求められるのかがまだ理解しきれないのです。 とくに少数を変換するときなどはまた戸惑ってしまい、それをまた16進数や8進数などスムーズに変換することができません。 基本的な質問で大変申し訳ないのですがどうかご教授頂ければ幸いです。 どうぞよろしくお願いいたします。

  • 2進数を16進数に変換するにはどうしたらいいのでしょうか?

    たとえば、10110111110という2進数を16進数に変換するには どうしたらできるのでしょうか?よろしくお願いいたします。 (本などで調べたら、下から4桁ずつ区切るとよいとかいてあったのですが よく意味がわかりませんでした。) コンピュータにあまり詳しくないので、どなたか初歩的に優しく教えていただけないでしょうか?

  • 2進数と10進数と16進数の変換について

    私の学校の情報の授業の中で、2進数を16進数にしたり、また、逆をやったり、10進数を交えた、変換のテストが毎回の授業であるのですが、私は納得がいかないのです。 8桁もある2進数の足し算をやらせたり、2進数の引き算、割り算・・・(その他、文章問題など) でも、文句ばかり言っていても始まらないのですが・・・     (履修不足問題で毎回、テストをやることになってしまったらしい) そこで質問です。 私の知っているやり方が、2進数なら、10進数を2でひたすら割っていき、余りを後ろから読む。16進数も同様です。 これが厄介なもので、2進数の4桁までならどうにか10進数に変換できるのですが、8桁ともなると、問題を見た瞬間に冷や汗です。(苦笑) これしか知りません。(16→10 も知りません) しかし、他の効率的なやり方があるという話を聞いたことがあります。 毎回、10進数に直して計算していると、確実に時間がないのです。 他の効率的なやり方をご存知の方、また、そういうサイトをご存知の方いらっしゃいましたら、返答、よろしくお願いします。

  • この10進数は?

    こんばんは。大学1年生です。 コンピュータ関連の授業で、「ある10進数を5進数で表現すると1の位が2桁の数字になり、3進数で表現すると1の位が0となった。この10進数は何か」という問題があり、回答が12(10進数)でした。 12という回答で合っていますか?また、この問題の考え方がはっきりとわからないので、わかる方に教えて頂きたいです。 お手数をおかけしますが宜しくお願い致します。

  • このシンプルな進数の変換はどういう流れで行っているのでしょう?

    このシンプルな進数の変換はどういう流れで行っているのでしょう? (1)06201E90h この16進数の数値が (2)2104976d こうなって、 (3)76491002 こうなることについて、 「PackedBCDに変換して下位から並べる」という説明を受けたんですが、 そのとき上記の数値と説明だけメモして納得したつもりが、後で実際に変換しようとすると訳が分からなくなりました。(2)から(3)へは、並んでいるのを2文字ずつとって逆にしていると分かったのですが、(1)から(2)が・・・。 (2)の末尾にdが付いてるので10進数に変換していると思うのですが、普通に変換したらEが14という2桁の数値になって意味不明になります。 また、PackedBCDは4ビットで1桁の10進数を表すとありましたが、 上記の式をそれに当てはめてどうしようというのでしょうか。(もしかしたら聞き間違えた可能性もあるので、似たような用語がないか調べているところです。) どなたかご教示くださいますでしょうか。

  • 2進数から10進数へ変換

    C言語で、2進数から10進数に変換するプログラムを作ろうと思っています。 手計算で行う場合は2進数の 下1桁目×1 下2桁目×2 下3桁目×4。。。と計算しています。 下○桁目を取り出す方法を考えているのですが、思いつきません。 3桁の2進数を変換するプログラム(とりあえず101を変換することを考えて・・・)を書いてみたのですが、101を考えすぎたためか上手くいきませんでした。 最終的には10進数でintの範囲内程度の2進数の変換ができるプログラムを書きたいと思っています。 アドバイスをお願いします。 ちなみに、考えてみたプログラムは以下の通りです。 101以外で上手く変換できませんね・・・ ここに貼り付けるのが恥ずかしいです。 #include <stdio.h> main() { int x ,i ,z[3]; scanf("%d",&x); z[0]=x/100*4; z[1]=(x/10-10)*2; z[2]=(x-110)*1; printf("%d",z[0]+z[1]+z[2]); return 0; }

  • コンピューターで扱う、2進数について

    コンピューターは0と1しか理解できず、 つまりそれは2進数で、それを4桁に区切って16進に変換して表現することが多いと思います。 今ふと思ったのですが、 何故16進なのでしょうか? 例えば3桁区切りで8進、5桁区切りで32進、 ではいけなかったのでしょうか? 例えばIPアドレスなんかも16進2桁ですよね? 2進の4桁+4桁ですよね。 単純にそう言う風に決めてしまったということなのでしょうか?

  • テキストボックス(###,#)の表示が16進数に変換されてしまう。

    こんにちは。VBA(ACCESS2003)初心者です。 どうぞ、よろしくお願いします。 現在、テキストボックスにカンマ書式(###,#)を設定しているのですが、16桁以上の数値を入れると、16進数に変換されてしまうのです。 これを、変換させずに入力したままの値にするにはどうしたらいいのでしょうか? すみませんが、ご回答を宜しくお願いいたします。