昨今の情報化社会を支える大事な要素がコンピュータですね。
しかしこのコンピュータが取り扱う数字は0と1の種類しかありません。
この0と1の種類で表す表記を2進数と呼ぶのですが、我々人間が扱う数字が0から9までの10種類を扱う10進数なので、最初に習う時は非常にややこしく感じますね。
僕自身も最初学校で習った時は苦労しました。
そして大学では情報学専攻だったなので、嫌でも2進数のことを学習せざるを得ない状況になりました。
今やスマホやパソコンなど、コンピュータが日常でありふれた社会になったので、2進数について最低限の知識は備えた方が身のためでしょう。
ただ全ての数字が0と1しか表示されないと、普通の人間には理解しがたいので、適宜10進数に変換されて表示されます。
この2進数から10進数、また10進数から2進数への変換がまた難しい部分と言えますね。
しかしコツさえ掴めばそんなに難しいことではないので、ぜひ今回の記事でマスターしてみてください!
2進数と10進数の相互変換
2進数と10進数の相互変換のやり方について解説する前に、まずは2進数と10進数とは何なのか?基本的な所から簡単に紹介しますと、
- 2進数とは、0と1の2個で表記された数字
- 10進数とは、0~9までの10個で表記された数字
となります。
本題に入る前にこの2進数と10進数それぞれについて、基礎的な情報から解説していきたいと思います。
少し長くなりますがお付き合いください。
10進数について解説
10進数(十進法)について改めて説明することはほぼないでしょう。
厳密に言いますと、0,1,2,3,4,5,6,7,8,9の10種類のアラビア数字を用いた位取り記数法です。
桁の増え方に関しては、
1→10→100→1000→10000→…といった感じで、左に1桁増えると10倍、右に1桁ずれると1/10になっています。
ここで各桁の“重み”について少し解説します。
“重み”と言われてもちょっとややこしくてピンと来ないかもしれませんが、
例えば10進数で「129」という数字では、以下のように3桁目の数字に100、2桁目の数字に10、1桁目の数字に1を掛けて、全て足し合わせれば元の数字と合致しますね。
129=1×100+2×10+9×1
この考え方は2進数から10進数へ変換する際に重要となりますので、覚えておきましょう!
2進数について解説
次に2進数(二進法)について解説します。
これも厳密な定義を説明しますと、2進数とは2進記数法のことで、0と1の2種類の数字だけで数値を表現したものを指します。
10進数との最大の違いは、0と1の2種類だけなので、2倍するごとに1桁ずつ上がる計算となります。
“0”と“1”の2つの数字は10進数と同じ“0”と“1”ですけど、“2”に関しては桁が1つ上がり“10”となります。
さらに2上がって“4”となると“100”、4上がって“8”となると“1000”となります。
10進数で1から16までの数字は、2進数で以下のように表現されます。
- 1(10進数)→1(2進数)
- 2(10進数)→10(2進数)
- 3(10進数)→11(2進数)
- 4(10進数)→100(2進数)
- 5(10進数)→101(2進数)
- 6(10進数)→110(2進数)
- 7(10進数)→111(2進数)
- 8(10進数)→1000(2進数)
- 9(10進数)→1001(2進数)
- 10(10進数)→1010(2進数)
- 11(10進数)→1011(2進数)
- 12(10進数)→1100(2進数)
- 13(10進数)→1101(2進数)
- 14(10進数)→1110(2進数)
- 15(10進数)→1111(2進数)
- 16(10進数)→10000(2進数)
上の一覧を見て気づくと思いますが、2,4,8,16・・・と「2のn乗」で表現されている数字で桁が1つずつ増えていることがわかりますね。
これを10進数に置き換えると、10,100,1000,10000・・・と「10のn乗」の時に桁が1つずつ増えることと同じです。このように考えると、たとえ0と1の2種類だけでも全ての数字を表現することが可能です。
要は1桁左に書かれた数字は、その右の数字よりも2倍の重みがあるということです。
2進数は言わずと知れたコンピュータの数値表現です。
ただ厳密に言えばコンピュータのみならず、例えば電磁気学においても、磁石のN極とS極、電圧の高低、さらに論理回路においては“真”と“偽”の2つの値を使用する際にもこの2進数は最適なのです。
- 2¹= 2= 10(2進数)
- 2²= 4= 100(2進数)
- 2³= 8= 1000(2進数)
- 2⁴= 16= 10000(2進数)
- 2⁵= 32= 100000(2進数)
- 2⁶= 64= 1000000(2進数)
- 2⁷= 128= 10000000(2進数)
- 2⁸= 256= 100000000(2進数)
- 2⁹= 512= 1000000000(2進数)
- 2^10=1024=10000000000(2進数)
のちのち10進数の数字を2進数に変換する際は、上の10個を覚えておけば少し役に立ちますよ。
2進数と10進数の変換
さて本題の2進数と10進数の相互変換についてですが、これについては
- 2進数から10進数への変換
- 10進数から2進数への変換
の2パターンがあります。
コンピュータ関連の学習には役に立ちますので、この機会にぜひ両方覚えておきましょう。
比較的簡単な1の方法から解説していきますね。
2進数から10進数への変換
2進数を10進数に変換するにはどうすれば良いのか?わかりやすく例を出しながら解説していきます。
「1110101」と表現された2進数の数字があったとします。
この数字を10進数に変えるには、各桁の数字にその桁の“重み”を掛けて、全て足し合わせればOKです。
ここで重みという言葉が出てきましたが、10進数の説明にも出てきましたね。
10進数では例えば「129」という数字があった時に、以下のように
129=1×100+2×10+9×1=1×10²+2×10¹+9×10⁰
と言った感じで、3桁目なら10の2乗、2桁目なら10の1乗、1桁目なら10の0乗を掛けて、それぞれを足し合わせた合計が元の数字と一致しました。(n桁目なら「10の(n-1)乗」という形になります。)
これと同じようなことを2進数でもやるわけです。
10進数の違いは、2進数の場合は1桁上がるごとに2を乗算しているので、重みは「10の(n-1)乗」ではなく「2の(n-1)乗」となります。
上で紹介した「1110101」という数字を、10進数でやった通りに計算すると
- 7桁目の数字は1なので、1×2⁶=64
- 6桁目の数字は1なので、1×2⁵=32
- 5桁目の数字は1なので、1×2⁴=16
- 4桁目の数字は0なので、0×2³=0
- 3桁目の数字は1なので、1×2²=4
- 2桁目の数字は0なので、0×2¹=0
- 1桁目の数字は1なので、1×2⁰=1
となるので、全て足し合わせれば
1110101=1×64+1×32+1×16+0×8+1×4+0×2+1×1
=117
となります。
これで2進数から10進数への変換は完了です。0と1だけなので計算は比較的楽ですね♪
10進数から2進数への変換
次に10進数から2進数への変換ですが、これは少しややこしいです。
今回は敢えてわかりやすいように、2進数から10進数への変換で用いた「117」で解説します。
この「117」が逆変換で2進数の「1110101」と一致すればOK、ということになりますね。
では気になるその方法ですが、基本となるのは算数の割り算です。
「117」という数字をまずは「2」で割ります。すると商が58で余りが1ですね。
この商58をまたさらに「2」で割ります。すると商が29で余りが0ですね。
こんな感じで最終的に商が0か1になるまで割り続けます。
上のような感じで2で割っていき、余りの数に注目してください。下から順番に並べていけば、元の2進数である「1110101」と一致しますね。
これが10進数から2進数への変換方法です。
ただしこれはあくまで“基本的な”方法に過ぎません。
わざわざ2で割り続けるだなんていうのは、正直面倒ですよね。
なのでここからは少し効率的に変換できる裏技的なテクニックを教えたいと思います。
10進数から2進数への簡単な変換法とは?
実は10進数の数字をやや簡単に2進数に変える方法があります。
しかしこの方法は前提として、2の累乗数をある程度覚えておく必要があります。
「2進数について解説」の章の部分で「2の10乗まで覚えておくと便利ですよ。」ということを書きましたが、実は10進数から2進数への変換時に役に立ちます。
先ほどと同じ「117」で解説しますと、2進数から10進数に変換した時に以下のような形になりましたね。
117=64+32+16+4+1
何が言いたいかというと、要はどんな数字も2の累乗数の和で表現出来ちゃうことです。
64=2⁶、32=2⁵、16=2⁴、4=2²、1=2⁰となるので、これで7,6,5,3,1番目の桁数は1で確定、4,2番目の桁数は0ということになりますね。
以上から
117⇒1110101
と変換できることになります。
では全く同じような感じで、今度は「1231」という数字を2進数に変換してみましょう!
やや大きい数字になりましたが、これでもやることは変わりません。2の累乗数を覚えておけば「1231」は以下のように表せます。
1231
=1024+207
=1024+128+79
=1024+128+64+15
=1024+128+64+8+7
=1024+128+64+8+4+3
=1024+128+64+8+4+2+1
手順としては、まず1231に一番近い2の累乗数である1024で表すようにします。
1231-1024=207なので、1231=1024+207となります。
次は207に一番近い2の累乗数は128なので、207を128+79の和で表します。
そして79は64+15、15は8+7、7は4+3、3は2+1・・・
こんな感じで順番に分解していくようにすればわかりやすいでしょう。
丸暗記しておけば各累乗数が2の何乗か、そして何桁目かも瞬時にわかると思います。
後は先ほどと同じように、各桁数ごとに0か1を割り振れば「1231」は
1231⇒10011001111
となりますね。
もちろんこの方法が本当に速くて効率的なのかは人それぞれだと思います。あくまで僕個人としての感覚です。
しかし2の累乗数は2進数だけでなく、コンピュータ関連の学習において使う頻度は高い方です。
また「2の16乗=65536」も比較的頻出です、ゲームプログラミングにおいてもよく出てきます。覚えておくに越したことはありませんよ。
コンピュータ内部では数値を2進数で表現していますが、マイナスの数をどう表現するのかが気になりますね。実は10進数と同じようにそのままマイナスと表記するのではなく、補数という特殊な考えが必要でした。
コンピュータの世界では2進数だけでなく、利便性を高めるため16進数も登場します。今回は16進数から10進数に変換する方法、及び10進数から16進数への変換を解説します。また16の累乗数と小数点以下の変換についても紹介していきます。
まとめ
今回は2進数と10進数の相互変換についての解説でした。
では改めて内容をまとめておきます。
- 2進数から10進数への変換は各位の数とその位の重みを掛けて、全て足し合わせる
- 10進数から2進数への変換は商が0か1になるまで2で割っていき、余りの数字を下から上へ順に並べる
- 2の累乗数を覚えておくと多少変換が楽になる
やっぱりなんだかんだで2進数と10進数はコンピュータ関連の学習ではよく出てきます。
理数系の学生にとって非常に大事な内容ともなるので、今回の記事でより理解を深めてもらえれば幸いです!