SSブログ

サルでも分かる二進数(IPアドレス計算) (2015/04/05) [雑記]

お久しぶりでございます。ブラック企業で働き、散々たる日々でございます。

さてさて、IT業界(ネットワーク系)にいるとIPアドレスの計算でしばしば二進数を使います。私は情報工学部出身の理系なので、さほど苦労しないのですが、新入社員や経験の浅い派遣さん、文系の人にとっては、かなりハードルが高いようですね。IPアドレス計算機なるフリーソフトもあるようですが、早々にあんなものに頼るようでは、この業界で長くはやっていけないでしょう。

とりあえずサルにも分かる計算ということで、専門的な難しい話は抜きにして、がんばって説明してみます。行き着くゴールは、「二進数でも十進数でも考え方は同じ」という、ただそれだけです。分かっている人にとっては、おそらくまどろっこしい説明だと思います。
IPアドレスが計算できれば良いということなので、最終的に計算対象とする数字は0~255までとします。少し難しく言うと8ビット分ですね。

まず、十進数の性質を書きます。ものすごく当たり前のことなので、算数が嫌いな人も少しだけガマンして下さい。

※ルール1※
【初級】1の位(0~9)だけでは、どんなにがんばっても10の位の数を表現できない
【初級】1と10の位(0~99)だけでは、どんなにがんばっても100の位の数を表現できない
【初級】1と10と100の位(0~999)だけでは、どんなにがんばっても1000の位の数を表現できない
【中級】つまり、15や83といった2桁の数字(10以上の数)を表すには、必ず10の位が必要
【中級】つまり、311や792といった3桁の数字(100以上の数)を表すには、必ず100の位が必要
【中級】つまり、8510や4696といった4桁の数字(1000以上の数)を表すには、必ず1000の位が必要
【上級】ある数を表す際、その数を表せる一番大きな位を使う必要がある。

※ルール2※
【初級】1の位を使って表現できる最大の数である「9」に1を足すと、10になる。これはその次の位である「10の位」の10である
【初級】1と10の位を使って表現できる最大の数である「99」に1を足すと、100になる。これはその次の位である「100の位」の100である
【初級】1と10と100の位を使って表現できる最大の数である「999」に1を足すと、1000になる。これはその次の位である「1000の位」の1000である
【中級】10の位の最小値である10から1を引くと、1の位を使って表現できる最大の数になる(つまり9)
【中級】100の位の最小値である100から1を引くと、1と10の位を使って表現できる最大の数になる(つまり99)
【中級】1000の位の最小値である1000から1を引くと、1と10と100の位を使って表現できる最大の数になる(つまり999)
【上級】ある位までで表せる最大の数に1を足すと、その数字が次の位の数になる

よく考えると当たり前すぎますが、上記が理解できていれば十分です。

では、243という数字を考えます。3桁(100以上の数)なので、100の位を使わないと表現できません。当たり前ですが、100の位は2が確定します。100の位の2によって「200」が表現できましたので、243-200=43、つまり、次に43を表現することを考えます。2桁(10以上の数)なので、10の位を使わないと表現できません。また当たり前ですが、10の位は4が確定します。10の位の4によって「40」が表現できましたので、43-40=3、つまり、次に3を表現することを考えます。はい、1の位は3です。これで243が表現できました。

20150403_10進.jpg


次に、二進数です。二進数は1と0だけを使って数字を表す記法です。1と0というのは、とどのつまり有り/無しを示しており、二進のそれぞれの桁が存在するかどうか(もっと平たく言えば、その桁が0でないこと)を示しているに過ぎません。でも何進数になろうが、考え方は同じなのです。何も恐れることはありません。

まず、1桁(1の位)の二進数を考えます。0と1しかありません。表すことができる数の最大は1です。…と、ここでルール2の【上級】を思い出してください。ある桁までで表すことのできる最大値に1を足すとどうなるのか。それが次の位の数になります。つまり、二進数の次の位は「2の位」となります。
つぎに1の位と2の位で表すことができる最大値は3です。そのため、その次の位は3+1=4、つまり「4の位」となります。1と2と4の位で表すことができる最大値は7です。そのため、さらにその次の位は7+1=8、つまり「8の位」となります。1と2と4と8の位で表すことができる最大値は15です。そのため、さらにその次の位は15+1=16、つまり「16の位」となります。
はい、ここまでくれば法則性に気付いたことでしょう。二進数の桁は下記の通りとなります。

20150403_2進.jpg


ここまで来ればもう半分以上分かったようなもの。二進数の10010101は十進数でいくつになるか? という問いに関しては、下記の通り数字を当てはめれば良いのです。それぞれの位の「1」という数字は、その桁に値が存在することを示していますので、128+16+4+1=159というのが10進数での数字となります。

20150403_2進_01.jpg


最後に、IPアドレスを計算する際に困る十進数から二進数への変換方法です。世間では除算の余りを下から縦に並べる方法がメジャーですが、同じ方法で説明しても面白くないので、ここでは別のアプローチ方法で説明します。たとえば、207を二進数に変換してみます。
まず、ルール1の【上級】を思い出して下さい。つまり、数を表す際、その数を表せる一番大きな桁を使う必要があるということです。二進数の位を大きい方から順(左から右)に見て行ていくと、128の位があり207 > 128です。なので、207という数を二進数で表現するには、必ず128の位が1になります。128の位が1ということは、207のうちの128について既に表せていることになりますので、207-128=79の79を残った桁で表すことになります。

20150403_2進_02.jpg


79 > 64ですので、64の位も1になります。79-64=15なので、32の位と16の位は0が確定します。15を同じように計算しても良いですが、15は16から1を引いた数です、ルール2の【中級】を見ると、16の位の最小値である「16」から1を引いた数は、8の位と4の位と2の位と1の位を使って表現できる最大の数となりますから、1111が確定します。ざっと以下のような感じです。

20150403_2進_03.jpg


ちょっとまどろっこしいかもしれませんが、いかがでしょうか。ここで記述する十進数から二進数への変換方法は、小学校の算数レベルでのこういった考え方と等価です。
『砂糖がxxxグラムあります。128グラムを取る長男、64グラムを取る次男、32グラムを取る三男、16グラムを取る四男、8グラムを…。長男から順に砂糖を取っていくものとし、自分の量が取れない人は、諦めて砂糖をそのまま次の兄弟に渡すものとします』 砂糖を取れた人を1、取れなかった人を0とすると、長男から末っ子までの1・0の並びは、二進数への変換結果に等しいです。
nice!(0)  コメント(0) 
共通テーマ:日記・雑感

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。