これまではOSI参照モデルやTCP/IP通信モデルの考え方を基準として、コンピュータネットワークをイメージしていただき、さらに通信モデルの低い階層から順に、使われている技術の概要を紹介してきました。
今回は関連コラムとして、コンピュータの内部やネットワークを通してやりとりされているデータそのものを把握することについて考えていきます。→連載「ネットワークの超基本! エンジニア1年目の教科書」のこれまでの回はこちらを参照。
デジタル機器が取り扱う“値"
私たちの身の回りにあるデジタル機器はすべて、情報を伝達するために「信号が流れていない状態」と「信号が流れている状態」という違いを判断して動作しています。2つの状態はそれぞれ「信号が流れていない状態:0」と「信号が流れている状態:1」に置き換えられ、初めて機器の内部に「数値」という概念が与えられます。
このとき、信号の通り道が1本の場合「0」と「1」という2種類の数値が表現できるようになりますが、もっと多くの値を扱いたい場合には、信号の通り道を増やして対応します。例えば、信号の通り道を3本用意した場合、それぞれどの線に信号を流すかで、下図の8パターンが表現できます。
3本すべてに信号が流れていない状態「000」から始まり、すべての線に信号が流れている状態「111」に至るまでの全パターンを数えると8通りあることがわかります。 これらを10進数に置き換えると0~7まで表現できるということになります。
例えば、3ビットの2進数を使って10進数の「3」を伝えたい場合は2進数の「011」にあたる信号を、10進数の「5」を伝えたい場合には2進数「101」にあたる信号を送っています。
機器の内部でもっと大きな値を扱うときは、信号線を増やすことで対応しています。コンピュータの性能を表す「32ビット処理」や「64ビット処理」という言葉は、機器の内部における信号線の本数と捉えることもできます。
機器を越えた情報の伝達を行うネットワークにおいても 2進数の考え方を土台にしているということは同じです。ただ、機器の間に32本もしくは64本の信号線を用意することは現実的ではありません。
ネットワークの場合、1本の信号線で連続した「0」と「1」を表す信号を高速にやり取りすることで情報の伝達を実現しています。
人間は2進数とどう向き合うか
デジタル機器は信号を「流さない」か「流す」の2パターンで情報を扱うことから、2進数の考え方を土台にすれば内部処理の様子が把握できるということをご理解いただけたと思います。
デジタル機器はデータを処理するために、何十桁もの「0」と「1」の羅列をやり取りしていますが、人間はそれらの羅列を見ても、何を意味しているのかすぐには判断できません。
そこで「2進数の桁(ビット)をある単位で区切る」、「分かりやすい数値に変換する」という手間をかけ、人間にとって理解しやすくする必要があります。
2進数の値を読解する方法として、一般的には以下の2つが用いられます。
- 2進数を10進数へ変換
- 2進数を16進数へ変換
ネットワーク動作の理解を深めていくためには、通信の送信元や宛先を表す「アドレス」を把握することが求められます。この時、2進数と10進数の変換方法を知っておくと、非常に役立ちます。
2進数と10進数の変換
まずは、2進数を10進数に変換する方法から考えてみましょう。繰り返しになりますが、1ビットの2進数は「0」と「1」という2種類の表現力を持っています。これは10進数でも同じように「0」と「1」として表現できるため、計算して変換するまでもありません。2ビットおよび3ビットの2進数は下図のように変換することができます。
図を参考に、“11010101"という8ビットの2進数を10進数に変換してみましょう。
Step1:2進数の「1」になっている桁を図に当てはめます。
Step2:当てはめた部分の10進数を足し合わせていきましょう
答えは「1+(なし)+ 4+ (なし) +16+ (なし)+64+ 128」⇒213となります。
どの桁で「1」が現れるかを見定めながら10進数の値と照らし合わせて計算すると、求める値を導き出すことができます。同じ要領で、以下8ビットの2進数を10進数に変換してみましょう。
・1111 0000 ⇒( 240 )
・1010 1010 ⇒( 170 )
・0110 0110 ⇒( 102 )
※( )内を選択すると、答えが確認できます
次は、10進数を2進数へ変換する方法を考えます。
「新しい桁(ビット)に初めて『1』が現れるときの値」が鍵を握ることは同じですが、今回は大きな順に「128、64、32、16、、、」と使っていきます。
実例として、10進数「200」を2進数へ変換するステップを図解します。
Step1:「200」は【128+あまり】に分解できるか確認する。 128+72に分解できることから、[10000000]を含むことが分かります。
Step2:前ステップのあまり「72」は【64+あまり】に分解できるかを確認する。 64+8に分解できることから、[01000000]を含むことが分かります。
Step3:前ステップのあまり「8」は【32+あまり】に分解できるかを確認する。 これは分解できないため、[00100000]を含まないことが分かります。
Step4:前ステップの持ち越し「8」は【16+あまり】に分解できるかを確認する 分解できないため、[00010000]を含まないことが分かります。
Step5:前ステップの持ち越し「8」は【8+あまり】に分解できるかを確認する 8+0に分解できるため、[00001000]を含むことが分かります。
Step6:最後の段まで同じ判断を繰り返します。
「200」は「128 + 64+(なし)+(なし)+ 8 +(なし)+(なし)+0」と分解できました。分解ができた128、64、8および0に該当する2進数を足し合わせましょう。
答えは【11001000】となります。
どの桁に「1」が当てはまるか、10進数を見定めながら計算することで、求める値を導き出すことができます。
同じ要領で、以下の10進数を8ビットの2進数に変換してみましょう。
・ 81 (0101 0001)
・100 (0110 0100)
・246 (1111 0110)
※( )内を選択すると、答えが確認できます
2進数⇔16進数の変換
2進数と16進数の変換は、ネットワークだけでなくプログラムを勉強する場合にも知っておきたい内容です。4ビットの2進数をまとめて、1桁で表わすことができるというのが大きな特徴です。
4ビットの2進数は最小値「0000」(10進数の0)から最大値「1111」(10進数の15)まで、16種類の値を表現することができます。
「10」から「15」の範囲は1桁で書き表せないため、アルファベット「A」「B」「C」「D」「E」「F」の6文字を使って、この範囲を補うことにしました。
16進数の書き方が確立すると4分の1の桁数で2進数をコンパクトに表現できるようになりました。しかも上の表を暗記してしまえば、2進数と10進数を変換した時のような(ビット数が増えると複雑になる)足し算が必要ありません。
上の表を参考に、さっそく変換を実践してみましょう。
表を参考にして、以下の2進数を16進数で表してみましょう。
1011 1110 1110 1111⇒( BEEF )
1111 0000 0000 1101⇒( F00D )
※( )内を選択すると、答えが確認できます
同じく、表を参考にして、以下の16進数を2進数で表してみましょう。
CAFE:⇒( 1100 1010 1111 1110 )
DEAD:⇒( 1101 1110 1010 1101 )
※( )内を選択すると、答えが確認できます
いかがでしたでしょうか。今回は2進数がデジタル機器における情報の処理や伝達に密接な関係を持つこと、その2進数を10進数や16進数へと変換する方法をご紹介してきました。
以下をポイントとして覚えておきましょう
・2進数と10進数の変換
「桁が繰り上がるときの値」が鍵となります(1、2、4、8、16、32、64……)
・2進数と16進数の変換
4ビットのまとまりを1桁で表すための「A」~「F」の存在
この後の連載を読み進める上でも、またネットワークエンジニアとしてさらに知識を深めていく場面においても役に立つポイントです。
次回からはコンピュータネットワークで利用される技術に話題を戻し、「ネットワーク層」について役割や動作、具体的に用いられる技術を複数回に分けて紹介していきます。
著者プロフィール
船橋 譲(ふなはし ゆずる)
ネットワンシステムズ株式会社
ビジネス開発本部イノベーション推進部ネットワークアカデミーチーム所属
2005年ネットワンシステムズ入社。保守サービスの品質向上のためのエンジニア育成に携わったのち、現在は顧客向けの技術インストラクターとして勤務。インストラクター歴12年。CCIE認定を取得し、[主にネットワーク技術全般およびセキュリティ関連技術の研修を担当している](https://www.netone.co.jp/service/lifecycle/academy/)。シスコシステムズ社認定インストラクターとしてCCSI Excellence Awardを2年連続受賞。