学校では教えてくれないこと

2進数と16進数を覚えよう!

2006.5

大文字と小文字の違い

1kgの「k」と1KBの「K」の違いは知っているかな?

1kg=1000g、1km=1000mの意味だよね。一般的な数量を表す単位系だと、小文字の「k」というのがつくと「1000」を意味する。これに対して「ファイルのサイズは50KBです」というようにコンピュータの世界だと大文字の「K」が使われている。この大文字の「K」は「1000」ではなく「1024」を意味してる。つまり、1KB=1024Bだね。

コンピュータは0/1の2進数で動作している、とよく言われてる。実は「1000」というのは、2進数では大変切りの悪い数字なんだ。そこで、210(2の10乗)である「1024」を基本にしたというわけ。ちなみに1MBの「M」も1024×1024の意味だよ。

大文字と小文字のついでに「b」と「B」の違いについても触れてみよう。例えば、ネットワークの通信速度の表記などでよく見かける「bps」と「Bps」という単位。これらは、どれくらい違うのだろうか。

小文字の「b」は「ビット」の意味。ビットは、コンピュータが動作する最小単位で0N(1)とOFF(0)の2つの状態を持つ小さなスイッチだと考えて。ビット値はそのまま2進数で表すことができる。ビットが4個あれば、24=16の状態の組み合わせを表現することができるよね。ビットが16個あれば、216=65536になる。「コンピュータは2進数で動作している」と言われるゆえんなんだ。

これに対して、大文字の「B」は「バイト」を意味してる。1バイト=8ビットと決められていて、これもコンピュータでデータを扱う上で基本単位となっているんだ。先の例に戻ってみよう。「bps」は「ビット/秒」、「Bps」は「バイト/秒」を意味してる。つまり、100Kbpsと100KBpsを比べると、100KBpsのほうが8倍高速であることを示しているんだ。

2進数と16進数

前置きが長くなってしまったけど、組込みの世界では、2進数や16進数をいかに早く正確に扱えるかが大変重要なスキルのひとつになる。いろいろな場面で、2/10/16進数をパッと相互変換できる力が求められる。これを間違えるとバグに直結するし、いちいち考えてしまうようでは仕事にならないんだ。よく使う値を紹介するね。まるごと暗記してしまってもいいと思う。
(注)ここでは以下のルールで「進数」を表現することにします。

  • 10進数:何もつけない
  • 16進数:先頭に「0x」をつける
  • 2進数:最後に「b」をつける

換算表

上記をみてもらえると分かるけど、2進数だと数が大きくなるにつれて桁数が膨大になってしまうよね。16進数を使うのはこれを扱いやすくするためなんだ。

ビット論理演算

デバイスドライバを書くときには、通常「レジスタ」というインターフェースを介してハードウエアを制御するんだ。レジスタはビットの集まりで、各ビットに異なる機能が割り当てられている。レジスタの種類や各ビットの機能を記述した資料は「データシート」と呼ばれていて、ハードウエア開発元から提供されるんだ。

デバイスドライバの開発は、このデータシートを読み込むところから始まるんだよね。それじゃ本題。レジスタの制御をプログラムから行う場合に必要となるのが「ビット論理演算」なんだ。例えば、8ビットのレジスタAがあるとする。このレジスタは以下の3つのビットに機能が割り当てられているんだ。

  1. ビット4を1にすると内蔵メモリをクリアする。
  2. ビット5を0にすると転送を開始する。
  3. ビット7が1になったら転送が完了したことを示す。

それぞれ以下のようなコードで表現することができる。

変数regは、上記レジスタAのアドレスが設定されているものとするね。

変数reg

まず、ビット4,5,7をそれぞれ2進数、16進数で表現すると以下のようになる(ビットは0から始まりますので注意)。

ビット4~7

(1)は、ビットOR演算子(|)を使って、ビット4を1にセットしている。これはわかりやすいよね。(2)は、ビットAND演算子(&)を使って、ビット5だけ0にクリアしている。これはすこしややこしいので、説明するね。

0x20にNOT演算子(?)がついているから、各ビットの1/0を反転させると下に示しているようになるんだ。

0x20

これを元のデータにANDすると・・・ビット5だけが落ちるのがわかるかな?

(3)も、ビットAND演算子を使った例だよ。ビット7だけマスクをかけてチェックするというやり方なんだ。

他にも「このビット以外をクリアしたい」「ビット5,6,7に値を設定したい」など、さまざまなパターンがある。また、レジスタのサイズも16ビット、32ビットと大きいものがあるから、制御しなければならないビットの数も増えていくんだ。

けれど、どんな場合も基本は上記例と変わらないんだ。データシートに記載されているとおりに、任意のレジスタのビットを正確に制御することができるようになれば、デバイスドライバの開発作業がよりスムーズになるよ。ぜひ、今回の「2進数と16進数」「ビット論理演算」を繰り返し練習して体に覚えこませてみて。同期に差をつけられること間違いなしだと思うよ。

ページのトップへ