エムゲーム・ジャパン ゲーム ミィア ブログ サークル マイエム Login

兵どもの夢の跡

ブログチャンネル
yuki002さん
 
 ブログトップ   マイブログ   ランダムブログ    
ブログ型ブログ型タイトル一覧タイトル一覧
16.ゼロとイチの不思議な関係[ソフトウェア考]  
詳細/おすすめ(3194/0) | ソーシャルブックマーク(0)  2009/08/12 01:13

概要でも説明したように

 

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系言語で書かれるのは

そういう理由があったからです。

 

この記事のURL /  カテゴリ /  コメント(2)  / おすすめ  / 通報
   カテゴリが追加できません!
   カテゴリが追加できません!