【はじめてのプチコン】16進数 | りょうのゲーム塾

りょうのゲーム塾

再開、準備中。

チェックポイント
コンピュータには2進数が都合がいいのは分かっていただけたと思います。
実際にプログラムの中でもハード(コンピュータや周辺の機械)よりのプログラムになると特にこの2進数が必要になってきます。
しかし我々が普段計算するのは10進数なのでその間で数値の変換を行うわけです。

ですが10進数だと2進数がピンとこないし、
2進数だと0と1の羅列なので実際に合ってるんだか間違ってるんだかわからないことが多く。
一つの値を指定するのに32ビットの場合には32桁必要です。(要するに冗長だということです)
この2進数の良さを残しもう少し分かりやすい表現方法があれば非常に助かると思いませんか?

そこで登場するのが16進数です。


今回のサンプルゲームでもBUTTON関数の値をマスクするのには2進数で考えた方が楽です。
例えばAボタンが押されたかどうかを判断するのに16という値が使用されていました。
しかしこの16の本来の意味はBUTTON関数が返す値がBOTTONのハードウェアの状態を1ビットで表し、
すべてのボタンの情報をまとめて返すため、必要なBOTTONの情報だけを抜き出す作業としてマスク処理を行う必要があり、
そのビット位置を指定するための &B000000010000 という値が必要だったからです。
これをそのまま2進数で使った方が10進数より分かりやすわけです。
しかしこれで本当に正しいのでしょうか?

2進数だと1が右に一つずれていても分かりにくためバグを生み出す危険性が残ります。
そこで10進数と2進数の間の表現として16進数を使います。

では16進数とはどんなものかですね。
当然、16で1桁上がりする数が16進数です。
では数えてみましょう。

0、1,2,3,4,5,6,7,8,9・・・ん?

次は10だけど・・・これでは桁上げしてますから一桁で表わさなければなりません。
皆さんは9の次の数字知ってますか?

実は私も高校2年になるまで0~9しか知りませんでした。

まぁ、結果として数字は9以上はないんです。

ないので9の次はAです。

ではもう一度数えてみます。

0、1,2,3,4,5,6,7,8,9,A,B,C,D,E,F 

これで15まで一桁で数えることができました。
次は16なので桁上げしていいので10となります。

ここで2進数と16進数と10進数の関係をまとめてみます。
2進数をバイナリといい、今後BINと表します。
16進数はヘキサデシマルといい、今後HEXと表します。
10進数はデシマルといい、今後DECと表します。

BIN HEX DEC
0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 8
1001 9 9
1010 A 10
1011 B 11
1100 C 12
1101 D 13
1110 E 14
1111 F 15

2進数から10進数へ変換したり、
10進数から2進数へ変換する方法は説明しました。
まぁ、はっきり言って変換するのは面倒です。

しかし、16進数はどうでしょうか?
2進数から16進数へ変換するには2進数を4桁毎に上の表から選んで書き換えればいいわけですよね。
16進から2進数も同様です。

では16進数から10進数へはどうするか?
方法は2進数から10進数へと変換するのと同じです。
掛ける重みが16のべき乗となります。

1桁目の重みは・・・16^0・・・1
2桁目の重みは・・・16^1・・・16
3桁目の重みは・・・16^2・・・256
n桁目の重みは・・・16^(n-1)

それに16進数1桁の値を掛けてすべての値を加算します。

たとでば16進数23を10進数に変換すると。。。

1桁目・・・重み1×16進数1桁の値3・・・3
2桁目・・・重み16×16進数1桁の値2・・・32
合計して32+3=35

答えは35となります。

10進数から16進数へは16で割った余りを2進数のときと同じように処理すれば変換できます。


じゃ、10進数と16進数の変換では2進数のときと同じかと思われますが、
明らかに桁数が4分の1なので計算量が違います。
これだけでもメリットになります。