この記事では、組み込み開発でとても重要な 2進数と16進数 について解説します。
なぜ組み込み開発では16進数を使うのか?
組み込み開発では、アドレスを意識した設計 を行うため、データを16進数で表現する場面が非常に多くあります。
例えば、
- EEPROM のアドレス指定
- 1バイトのデータ内容の表現
- ファイル書き込み時のエンディアン(データの並び順)
- レジスタ設定
など、ハードウェア寄りの処理では ビット単位の操作 が必要になるため、16進数が非常に便利です。
「10進数じゃダメなの?」と思うかもしれませんが、 ビット操作と相性が良いのが16進数 なんですね。
2進数(バイナリ)の基礎
まずは2進数の基本から。
- dec(デシマル):10進数
- bin(バイナリ):2進数
10進数は 0〜9 で桁が繰り上がりますが、 2進数は 0 と 1 の2種類 しかないため、2つ増えるごとに桁が繰り上がります。
例:
| 10進数 | 2進数 |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 2 | 10 |
| 3 | 11 |
| 4 | 100 |
2進数 → 10進数の変換方法
2進数の各桁に 2のべき乗 を掛けて足し合わせます。
例: 2進数 101
- 一番右:1 × 2⁰ = 1
- 真ん中:0 × 2¹ = 0
- 左:1 × 2² = 4
合計:5
このように、4桁の2進数(0000〜1111)で 0〜15(16種類) を表現できます。
ビットとバイトの関係
組み込みではよく出てくる単位です。
- 1ビット:2進数1桁
- 1バイト:8ビット
例: 1バイト = 10101010(8桁の2進数)
16進数(ヘキサデシマル)の基礎
16進数は、0〜15 を1桁で表現できる数の表現方法です。
- 0〜9 → 数字
- 10〜15 → A〜F
| 10進数 | 16進数 |
|---|---|
| 10 | A |
| 11 | B |
| 12 | C |
| 13 | D |
| 14 | E |
| 15 | F |
プログラムでは 0x を付けて表現します。
例: 0x1A、0xFF
16進数 → 2進数の対応
16進数1桁は、2進数4桁に対応します。
| 16進数 | 2進数 |
|---|---|
| 0 | 0000 |
| 1 | 0001 |
| 9 | 1001 |
| A | 1010 |
| B | 1011 |
| F | 1111 |
つまり、
- 16進数1桁 = 2進数4桁
- 16進数2桁 = 2進数8桁(=1バイト)
という関係になります。
1バイトを16進数で表すと?
1バイト(8ビット)は、
- 2進数:00000000〜11111111
- 16進数:0x00〜0xFF
例: 0x31 → 2進数では 00110001
このように、1バイトの内容を 2桁の16進数 で簡潔に表現できます。
組み込みで16進数が便利な理由
組み込み開発では、マイコン内部の設定を行う際に レジスタ を操作します。
レジスタは、
- 1ビットごとに意味が決まっている
- 0/1 の組み合わせで機能を設定する
という特徴があります。
例: ADC の設定レジスタ(4〜6ビット目でリファレンス電圧を選択…など)
このとき、
- 2進数で
00011000と書くより - 16進数で
0x18と書いた方が分かりやすい
というメリットがあります。
また、組み込みエンジニアは
- A = 1010
- F = 1111
など、16進数と2進数の対応を自然に覚えているため、 16進数の方が頭の中で処理しやすい のです。
試験でもよく出るし、ツールも作りました
2進数・16進数は、基本情報技術者試験などの資格でも頻出です。
私のホームページでも、 2進数・16進数の変換ツール を公開しているので、 興味があれば使ってみてください。
例: 16進数 FF → 10進数 255

まとめ
- 組み込み開発では 2進数・16進数が必須
- 16進数1桁=2進数4桁
- 16進数2桁=1バイト
- レジスタ設定などで16進数が圧倒的に便利
- 試験でもよく出るので覚えておいて損なし
組み込みを学ぶなら、まずはこのあたりをしっかり理解しておくと後が楽になります。
以上、2進数・16進数の解説でした。ありがとうございました!
