【プログラムが動く仕組み】第2回 データが2進数で動くイメージを持つ

あなた

プログラムってどうして動くの?

プログラムが動作する仕組みを頭の中でイメージできるようになるためには、パソコンの内部で情報がどのような形式であらわされて、どのような方法で演算されているかを知ることが重要です。

プログラムが実行するまでの全体の流れ

前回CPUについて解説を行ったので、今回はデータと2進数について解説していきます。

コンピュータの値は、パソコン内部ですべて2進数の値として扱われています。つまり2進数で情報を表し、2進数の情報を演算する仕組みをマスターすれば、プログラムが動作する仕組みが見えてくるわけです。

コンピュータが情報を2進数で扱う理由

コンピューターの中にはICと呼ばれる電子部品がたくさんあります。これらのICの黒いボディーの両側に、数本から数百本のピンが付いたムカデのような形状や、裏側にピンが並んだ剣山のような形をしています。

これらのICが持つすべてのピンには電気が流れます。つまりICのピン1本では、2つの状態しか表せないのです。このような特性からコンピュータでは必然的に情報を2進数で取り扱わなければならないことになります。

コンピュータが取り扱う情報の最小単位であるビットは2進数の1桁に相当します。基本的に2進数の桁数は8桁、16桁、32桁のように8の倍数にするのが一般的です。

これは、コンピュータの取り扱う情報の単位が8桁の2進数を基本としているためです。8桁の2進数のことをバイトと呼びます。バイトは情報の基本単位になります。

プログラム上で10進数や文字であらわされている情報であっても、プログラム実行時には、2進法の情報として扱われます。

そもそも2進数とは?

そもそも2進数にとは何でしょうか。2進数の仕組みを明らかにするために、「00100111」という2進数の値を10進数の値に変換してみます。2進数の値を10進数の値に変換するには、2進数の各桁に「重み」をかけ、その結果を足します。

重みについて

重みについて説明します。10進数の39という数字を考えると、3は3×10を表し、9は9×1を表しています。

この各行の数値にかける10や1などの数値を重みと言います。桁が上がれば、だんだん重くなっていきます。10進数なら1桁目が10の0乗(=1)、2桁目が10の1乗(=10)、3桁目が10の2乗(=100)…となります。

2進数も同じです。2進数なら1桁目が2の0乗(=1)、2桁目が2の1乗(=2)、3桁目がの2乗(=4)…となります。

結果を足す理由について

次に各行の数値に重みをかけて足すことの理由を説明します。そもそも数値というのは、その数値を構成する各桁の数値に重みをかけた値を合計した結果を表しています。例えば39という10進数なら、30+9を表しています。

この考え方は2進数でも同じです。「00100111」は(0×128)+(0×64)+(1×32)+(0×16)+(0×8)+(1×4)+(1×2)+(1×1)=39となります。

2進数で行われるコンピューターならではの演算

では今度は2進数の演算について考えていきます。まず四則演算については、2進数の場合も10進数同様に行うことができます。ここで扱うのはコンピュータならではの演算について扱っていきたいと思います。

今から出てくるシフト演算や論理演算が実際にプログラムの中で活躍するのは、情報をビット単位で処理するときです。プログラマであれば、これらの演算のイメージを必ず身に着けておきたいところです。

シフト演算

2進数であらわされた数値の桁を左右にシフトする計算です。

左にシフトする演算

まず左にシフトする場合を考えてみます。図を見てください。

「00100111」を左に2桁シフトした結果が「10011100」であることは、2桁だけ左にシフトしたことによって値が4倍になっていることを意味しています。10進数で考えると39×4=156できちんと4倍になっていることがわかりますね。

これはよく考えてみると当たり前のことです。10進数でも桁を左にシフトすると10倍、10倍、1000倍…となります。

これと同様に、2進数なら桁を左にシフトすると2倍、4倍、8倍…となります。反対に右にシフトしたら、1/2倍、1/4倍、1/8倍…となります。つまりシフト演算はかけ算やわり算の代用にもなります。

右にシフトする演算

2進数を右にシフトする場合は、空きができる上位の桁に入れる数値が「0」の場合と、「1」の場合があります。それぞれの場合についてみていきます。

算術右シフトと論理右シフト

算術右シフトと論理右シフトの概念を図であらわしました。このように算術右シフトの場合は、空いた上位にシフト前の符号ビットの値を格納します。一方で論理右シフトの場合は、空いた上位にゼロを格納します。算術シフトと論理シフトを区別しなくてはならないのは、右シフトの場合だけです。

論理右シフト

算術右シフト

MEMO

符号ビットとは?

2進数でマイナスの値を表す方法は、最上位桁を符号のために使うという方法です。この最上位桁のことを符号ビットと呼びます。符号ビットが0の場合は、プラスの値を表し、符号ビットが1の場合は、マイナスの値を表します。

コンピュータのマイナスの計算は補数と言われる数値を用いて行われます。補数のことについては話し出すと長くなってしまうので割愛しますが、非常に重要な概念です。

論理と聞くと難しそうに思われるかもしれませんが、実は簡単なことです。論理と対になる言葉が算術です。

2進数であらわされた情報を四則演算する数値として取り扱うことが算術で、ただの0と1の羅列やグラフィックスのパターンとして扱うことが論理です。

あくまでも論理演算をマスターするには2進数が数値を表しているという考え方を捨て去ることです。

論理演算には大まかに4種類の演算があります。表に論理演算の結果をまとめておきます。これらの値は真理値表とも呼ばれます。

まとめ

CPUやその他のICでも、扱えるデータはすべて2進数です。今回一番大切なポイントは、コンピューターならではの2進数の演算について知っておくということです。これらはビット単位で計算するコンピュータならではの計算だからです。

冒頭で書きましたが、コンピュータのデータはすべて2進数で制御されています。この2進数を理解することができれば、プログラムの動きについてもわかるようになります。

次回はコンピュータが小数点計算を間違える理由について解説していきます。