
2進数と16進数を簡単に理解する方法
どうも、himawariです。早速ですが、学生の頃、2進数や16進数を学習する機会があったのですが、あれ、いつ使うんでしょうね。プログラミングも10進法で出来てしまうから、情報系の方もほとんどいらない知識でしょうし…。雑学的に「2000バイトは2K(キロ)バイトと表記するけど、実際は2048バイトなんだよ」くらいでしか日常見かけることはありません。なので馴染みが薄く、簡単なのに覚える気になれない進法かなと思いました。
さて前置きが長くなりましたが、ざっくりと2進数や16進数って何なのか、についてを解説してみたいと思います。
そもそも我々の生活は10進数で成り立っているので、9の次は10、10の次は11…だと子供の頃から理解しています。実際には桁上がりなので、0から始まり9の次は10のくらいの1、、と覚えるべきなんですが…。
ちなみになぜ10進法が当たり前なのかというと、諸説ありますが人間の指の数が10本だからだそうです。また無意識にもう一つ、実は12進法や60進法を取り入れているものが世界共通であります。それは時計です。10の次は11、11の次は12、12の次は”1”ですよね。秒針だと60秒で一周するのもその方が都合がいいからです。
2進数とは
コンピュータが理解できるのは、0 か 1 か のふたつだけ。ということを聞いたことはありませんか?これはON OFFの概念なのですが、昔は電気信号のON OFFを利用し、点いたか、そうでないかを判断することでコンピュータは進化を遂げてきました。その根底は今でも変わることはありません。
具体的には、下記をご覧ください。これが2進数です。
1010 0111 ←これが2進数です。
0または1で表した数字が8桁あります。1桁を1ビットと呼び、8桁で1バイトを表しています。この1バイトで0〜255まで(256パターン)の数字を表すことが可能になります。
2進数を10進数にするには
実は関数電卓のような複雑な電卓がなくても案外簡単に計算できます。暗算でできる人もいると思いますが、計算方法は下記になります。
ご覧ください。
x x x x x x x x ※困惑しないように0または1をxで表しています
( 128|64|32|16 | 8 | 4 | 2 | 1 ) まずはこのように、右端から数が倍になる八個の箱があると考えてください。
続いて、下記例のように、2進数で表した数字に対し、1が入ってる部分の箱を残します。
例:
1 0 1 0 0 1 0 1
( 128| - | 32 | - | - | 4 | - | 1 ) ※上の1に対応した箱だけ残す
さいごに、残った数字を足す。それだけです。165になるかと思います。
これで0〜255までの256パターンを表すことができるようになりました。
10進数を2進数にするには?
続いては逆パターンですが、10進数を2進数に変換する方法をやってみます。
( 128|64|32|16 | 8 | 4 | 2 | 1 ) こちらの表を必ず覚えてください。
例えば2進数に変換したい数字を思い浮かべましょう、、、たとえば、98です。
10進数の”98”を2進数に変換してみましょう。
( 128|64|32|16 | 8 | 4 | 2 | 1 )左端から98を超えないやつを見つけていきます。
128は98より大きいので”0"
64は98より小さいので”1”(98 - 64 = 残り34)
32は34より小さいので”1” (34 - 32 = 残り2)
16は2より大きいので”0”
8は2より大きいので”0”
4は2より大きいので”0”
2は2と同じなので”1” (2-2=残り0)
残り0なので”0”
0 1 1 0 0 0 1 0 これで完成です。
もう一度書きますが、( 0 | 64 | 32 | 0 | 0 | 0 | 2 | 0 ) 合わせたら98になりますよね。
16進数を2進数や10進数に変えるには?
16進数とは何か…から理解しましょう。0〜15までを数字とアルファベットを用いて表す機械用の数字です。
0,1,2,3,4,5,6,7,8,9ときて、10はA、11はB、、15はF、16は1、、「は!?」となる人も多いかと思いますが、大丈夫です。というかすごく簡単なので。ではトライしてみましょう。
2進数を16進数への計算方法について
( 8 | 4 | 2 | 1 ) これを覚えるだけです。これで0〜15までを表せることは2進数の変換で理解できたかと思います。冒頭で8ビットは1バイトという話をしましたが、4桁区切りで16進数の1桁を表すことができるようになっています。
例1:0101 0011 (10進数で83になります)
(5)(3) ※16進数に変換されています
※これは10進数の”53”とは全く別のものですのでご注意ください
例2:1011 0111(10進数で183になります)
(B)(7) ※”1011”は10進数で”11”ですので16進では”B”を指します
このように2進数を4桁区切りで計算するだけで簡単に表せるのが16進数です。
16進数を2進数にするには
A F こう書いてあったら、、A=10、F=15なので、
”1010” ”1111” これで完了です。2進数が理解できていればすぐに覚えられますね。
16進数を10進数に変換するには
まずは2進数に変換していくと簡単に計算が可能です。
16進数で” 3 D ” と書いてある場合、”0010” ”1101” ※D=13です
”0010 1101” を( 0 | 0 | 32 | 0 | 8 | 4 | 0 | 1 )足し算しましょう。10進数の45になったはずです。
おさらい
2進数が何なのか理解しましょう:(8421)右桁が倍になっていく
16進数はA~Fが10進数の何に対応するのか覚えましょう(A=10、F=15)
以上です。
いかがだったでしょうか。説明がわかりにくかったらすみません。また他にも思いついたことがあったら書いてみたいと思います。ありがとうございました。