タグ別アーカイブ: 2進数

0と1だけでどうやってプログラムをつくるのか

コンピュータが扱うのは0と1だけと繰り返し伝えてきました。

数字だけでどうやってコンピュータに指示するんだ?

この疑問は誰でも持つのです。

ここが理解できれば、コンピュータの頭脳(CPU)を理解することになります。

実は、数字の羅列の中には命令コードと呼ばれる数字と、その命令を実行するために

必要なデータとしての数字の2種類あるのです。

「命令+データ」が1つの組み合わせとなって、多数並べてプログラムとして動くのです。

(一部データが不要な命令もあります)

しかし、命令もデータも同じ数字ですので、一見区別できません。

また、数字がずれた場合、CPUはどのようにずれたか分かりませんので、無理やり実行しようとして暴走します。

ゲーム機が突然変な画面になって止まるのは、この様な理由からです。

CPUがプログラムを実行するためのルールは以下の通りです。

  1. 命令として数字を取り出す。
  2. 命令によって、処理に必要なデータの数が分かるので、その個数分の数字を取り出す。
  3. 命令を実行する。
  4. 1に戻って繰り返す。

たったこれだけです。

簡単なCPUを仮想的に作って処理させてみましょう。

シンプル1号というCPUを作ってみます。

このCPUは8ビット単位で処理します。

よって、命令の種類は最大で256個となります。

8ビットの数字を管理できる箱を1つ持っています。

計算はこの箱を使って行います。

この箱のことをアキュムレータ(以下ACC)と呼びます。

命令を表す数字(16進数) 命令内容 必要なデータ数
00h ACCに、データの数字を代入する 1
01h ACCに、データの数字を加える 1
FEh 画面にACCの内容を表示する 0
FFh CPUの動作を停止する 0

3種類の命令しか持っていません。

では、プログラムを作ってみます。

00h 14h 01h 3Fh FEh FFh

たった5つの数字です。

では、シンプル1号に処理させてみましょう。

まず、00hを取り出し、命令表と比較すると、命令番号00hが見つかります。

必要なデータ数は1つですので、次の数値14hを取り出します。

この数値をACCに代入し、この命令の処理は終わります。(ACC=14h)

次に、01hを取り出し、命令表と比較すると、滅入れ番号01hが見つかります。

必要なデータ数は1つですので、次の数値3Fhを取り出します。

この数値をACCに加え、この命令の処理は終わります。(ACC=14h+3Fh=53h)

FEhを取り出し、命令表と比較すると命令番号FEhが見つかります。

必要なデータ数は0なので、データは取り出さず命令を実行します。

画面に53hと表示し、この命令の処理は終わります。

FFhを取り出し、命令表と比較すると命令番号FFhが見つかります。

必要なデータ数は0なので、データは取り出さず命令を実行します。

CPUは動作を停止します。

以上でCPUの動作が完了します。

見事に8ビットの数字の羅列だけでプログラムが実行できましたね!

実際のCPUには数多くの命令がありますが、処理内容の基本はシンプル1号とまったく同じなのです。

テストとして、シンプル1号をJavaScriptで実現しました。

試してみてください。

{{insert_meta simpleno1}}

[source language=’javascript’]

プログラム:
※16進数を1バイトずつスペースで区切って入力してください。


実行結果


[/source]

2進数とは 〜0と1だけじゃ長すぎ〜

2進数については、既に山を越えています。

ここまで大変だったかもしれません。

この講義で2進数は最後です。

よかったですね。

今まで2進数を用いて数を表現してきましたが、桁数が多くなるし、

0と1しか使わないので見た目に間違いやすいのです。

そこで、16進数を使います。

2の4乗は16なので、非常に変換しやすいのです。

2進数4桁を16進数1桁にするだけです。

けど、16進数の数を表す記号って何だ?と思われるでしょう。

実は、0から9まではそのまま使い、10〜15まではA,B,C,D,E,Fをそれぞれ割り当てます。

まとめたものが、次のようになります。2進数は絶対値表現です。

10進数 2進数 16進数
0 0000 0000 0
1 0000 0001 1
2 0000 0010 2
3 0000 0011 3
4 0000 0100 4
5 0000 0101 5
6 0000 0110 6
7 0000 0111 7
8 0000 1000 8
9 0000 1001 9
10 0000 1010 A
11 0000 1011 B
12 0000 1100 C
13 0000 1101 D
14 0000 1110 E
15 0000 1111 F
16 0001 0000 10
255 1111 1111 FF
256 1 0000 0000 100

2進数の4桁毎にまとめるだけなので、簡単ですよね?

16進数から2進数への変換はその逆に16進数1桁を2進数4桁に変換していくだけなので、これも簡単です。

2進数の数字をまとめるのには、16進数が非常に簡単なので、コンピュータのプログラミングには16進数を使って表現します。

16進数2桁が1バイト(8ビット)になるので、これを基本として用います。

そして、16進数の数を人が区別つけるために、数字の後にh(hexadecimal)を付けます。

10hは、10進数では16を意味します。

2進数8桁が、16進数2桁になるだけで、グッと実用度が増しましたね!

皆さんもドンドン16進数を使ってください。