組み込み開発で必須の「2進数」と「16進数」を分かりやすく解説

この記事では、組み込み開発でとても重要な 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進数
00
11
210
311
4100

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進数
10A
11B
12C
13D
14E
15F

プログラムでは 0x を付けて表現します。

例: 0x1A0xFF

16進数 → 2進数の対応

16進数1桁は、2進数4桁に対応します。

16進数2進数
00000
10001
91001
A1010
B1011
F1111

つまり、

  • 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進数, 10進数, 16進数 リアルタイム変換ツール
リアルタイム変換ツールテキストボックスに値を入力すると、直ちに他の進数表現に変換して出力します。2バイト、4バイトに対応。エンディアン変換もできます!.txtbox_parent {position: relative;}.monospac...

まとめ

  • 組み込み開発では 2進数・16進数が必須
  • 16進数1桁=2進数4桁
  • 16進数2桁=1バイト
  • レジスタ設定などで16進数が圧倒的に便利
  • 試験でもよく出るので覚えておいて損なし

組み込みを学ぶなら、まずはこのあたりをしっかり理解しておくと後が楽になります。

以上、2進数・16進数の解説でした。ありがとうございました!