概要でも説明したように
2進数、8進数、16進数、ブール代数 について書いておきます。
パソコンはデジタル機器です。
そのくらいは誰でも知っているとは思いますが、ソフトウェアとデジタルの関係を問われると…。
パソコンにはCPUやメモリーといった半導体素子が使われ、
その中身は 0(ゼロ)と1(イチ)のスイッチング回路の化け物なのです。
単純にスイッチの両端の電圧の状態によって 0と1を表現し、
その組み合わせによって情報を処理しているのです。
情報の最小単位はご存知のように bit と呼ばれる0と1です。
これはそのまま2進法で表現可能で、その演算にはブール代数が用いられます。
数字が 0と1の2つしかありませんから、基本的な演算は極めて簡単です。
和: 0+0= 0、 0+1=1、 1+1=10(桁上がり)
差: 1 - 1 = 0、 0−1=−1 (または01:桁下がり)
積: 1×0= 0、 1×1=1
商: 1÷1= 1、 0÷1=0、 X ÷0=不可
実にこれだけです。
ブール代数とは言っても実態は論理演算ですから
否定: not 0 = 1、 not 1 = 0
論理和: 0 or 0 = 0、 0 or 1 = 1、 1 or 1 = 1
論理積: 0 and 0 = 0、 1 and 0 = 0、 1 and 1 = 1
排他的論理和: 0 exor 0 = 1、 0 exor 1 = 1、 1 exor 1 = 0
なぜ こんな事を説明しているのかという理由ですが、これがコンピュータ演算のすべてだからです。
ここで勘違いしてほしくないのは 論理的演算と物理的演算を混同しない事です。
和 と論理和 の場合、桁上がり(下がり)が異なります。
それはビット列と見るか数値として見るかの違いだからです。
積と論理積も同様です。 まして排他的論理和などという概念もあるからです。
2進数
文字どおり 0 と 1 で表現される数値で Binary とも呼ばれます。
これは単純に10進数を2で割った余りで得られます。
例: 7342 ⇒ 1110010101110(2)
まず 7342 を 2で割り、その余りが最下位の桁になります。 ⇒ 0
その商 3671 を また 2 で割り その余りが次の桁になり… ⇒ 10
その商 1835 を また 2 で割り その余りが次の桁に… ⇒ 110
・・・・・・・・・・
その商 3 を また 2 で割り その余りが次の桁に… ⇒ 110010101110
その商 1 を また 2 で割り その余りが次の桁に… ⇒ 1110010101110
というように 余りを羅列する事によって得られます。
このように CPU内部では 数値が2進数という形で扱われます。
そして2進数は電圧で表現されるわけです。
この2進数は当然 整数で、CPUのレジスタサイズそのものなのです。
ですから 32ビットCPUでは 扱える最大の整数は 1 が32個並んだ2進数なのです。
8進数
さて、2進数の理屈が分かったところで、何か気付きませんか?
そうです。 小さな数を表現するにしても、やたら桁数が大きくなってしまう事なのです。
その不便さを解消するため、8進数にしてみましょう。
例 : 7342 ⇒ 1110010101110 (2)
16256 (8)
ご覧のように かなり桁数が少なくなりましたね。
さて この 7342 の2進数表現を3桁ごとに書いてみます。
7342 ⇒ 1_110_010_101_110 (2)
ところで 2進数3桁で表現できる数値範囲って どんなだったかしら?
000 (2) 〜 111 (2)
ですよね?
これって8進数で表すと
0 (8) 〜 7 (8)
あらら? これって 8進数の1桁なのでは?
という訳で、 先ほどの例は 7342 ⇒ 16256 (8) となるわけです。
8進数ならば 0 〜 7 という数字がそのまま使えるのでイメージ的には良いのですが…。
CPUって 4ビット単位でしたよね?
8進数は3ビットで1桁になるんですよ。
イメージしやすいけど 論理的には使いにくいんですね。
では4ビットごとに区切れば?
16進数
と言う事で 16進数なのですが、あいにく算用数字は 0 〜 9 までなのです。
これでは表現の方法がありません。
という訳で、10に当たるものを A として、 A、B、C、D、E、F を数字として使います。
それぞれ 10 〜 15 なのですね。
そのかわり表記方法を &H をプレフィックスとして付けたり、'H' をサフィックスとして使います。
表記法が分かったところで 先ほどの8進数の例を表現してみます。
7342 ⇒ 1CAE H
となります。
8進数を思い出してみてくださえい。
2進表記を3桁ごとに区切ったのでしたね?
では4桁ごとに区切ってみましょう。
7342 ⇒ 1_1100_1010_1110 (2)
⇒ 1CAE H
どうでしょう?
16進表記では2進数の4桁ごとに対応している事がお判りになりましたでしょうか?
まとめ
実際のところ CPUのアーキテクチャ上 16進表現が多用されています。
何より2進数と親和性が高いため、そのままアドレス表記に使われます。
という訳で ソフトウェアを扱う者にとって、2進数や16進数の理解は通過儀礼そのものなのです。
言い換えると、16進表記を知らないとハードウェアに密着した処理は書けないと言う事なのです。
事実、UNIX系のOSは C言語で記述され、ポインタやアドレスを頻繁に使用します。
アセンブラでは当然メモリーのアドレスが頻繁に参照されます。
ポインタを使わない言語では 内部で変数に対して自動でアドレスを割り振りします。
そのため アセンブラで記述されたコードには速度的に太刀打ちできません。
ハッキリ言ってしまうと 処理が遅くなるのです。
このような性質があるため、組み込み系やゲーム開発ではハードウェアに密着した言語が使用され
メモリーのアドレス表記やビット演算には16進数値が付きものなのです。
Javaでゲームプログラムを記述できるのは単にメモリーが大きく処理速度が速い環境ゆえなのです。
本当にコンパクトで実行速度のシビアな環境になれば 今だアセンブラが活躍します。
PC用デバイスドライバやOSそのものは効率を考えC系言語で書かれるのは
そういう理由があったからです。
|