基数とは|2進数・8進数・16進数の基礎とコンピュータでの使い方をやさしく解説
コンピュータの世界では、10進数だけでなく2進数・8進数・16進数といった「基数」が当たり前に登場します。本記事では、基数とは何かという基本から、なぜコンピュータが2進数を使うのか、0b/0o/0xの表記、10進数との相互変換の手順、ビットとバイトの関係、色コードなどで16進数が好まれる理由まで、初心者向けにやさしく解説します。
プログラムを書いていると「0b1010」「0o17」「0xFF」といった、見慣れない接頭辞のついた数字に出会います。これらはすべて、私たちが普段使う10進数とは違う基数(きすう)で書かれた数です。一見ややこしく感じますが、仕組みを理解すればどれも同じ「数の表し方の違い」にすぎません。本記事では、基数とは何か、なぜコンピュータが2進数を使うのか、そして各基数の相互変換までを順を追って解説します。
基数とは何か
基数(base / radix)とは、数を表すときに「いくつの数字を使って桁を繰り上げるか」を表す値です。私たちが日常で使う数は0から9までの10種類の数字を使い、9の次で桁が上がります。これが10進数(基数10)です。
たとえば10進数の「253」は、各桁が10の累乗の重みを持っていると考えられます。
253 = 2×10² + 5×10¹ + 3×10⁰
この「10」の部分を別の数に置き換えたものが、ほかの基数です。基数2なら使える数字は0と1の2種類、基数8なら0〜7の8種類、基数16なら0〜9とA〜Fの16種類になります。どの基数でも「各桁が基数の累乗の重みを持つ」という考え方は共通しており、これさえ押さえれば変換も難しくありません。
同じ数でも、基数が違えば見た目はまったく変わります。実際にいくつかの数を入れて見比べてみたい場合は、基数変換ツールで2進数・8進数・16進数の表記を同時に確認すると、対応関係が直感的につかめます。
なぜコンピュータは2進数を使うのか
コンピュータが内部で2進数(基数2)を使うのは、電子回路にとって「2つの状態」がもっとも扱いやすいからです。電圧が高いか低いか、スイッチがオンかオフか、電流が流れているか流れていないか——こうした2択の状態は、回路で確実に区別できます。これを0と1に対応させれば、すべての情報を電気の状態として表現できるのです。
もし10進数をそのまま回路で扱おうとすると、0から9までの10段階の電圧を正確に区別する必要があり、ノイズや劣化に弱く、設計も格段に難しくなります。状態が2つだけなら、多少のノイズがあっても「高いか低いか」を判定しやすく、回路をシンプルかつ高信頼に保てます。
2進数の「1011」は、10進数の 1×8 + 0×4 + 1×2 + 1×1 = 11 を表します。
このように2進数は桁数こそ多くなりますが、0と1だけで任意の数を表現できます。数値だけでなく、文字・画像・音声・プログラムそのものまで、コンピュータが扱うあらゆるデータは最終的にこの0と1の並びに落とし込まれています。2進数はコンピュータにとっての「母国語」と言えます。
各基数の表し方:0b・0o・0x
同じ「10」という文字列でも、2進数なのか10進数なのかで意味がまったく異なります。そこで多くのプログラミング言語では、数の先頭に接頭辞を付けて基数を区別します。
| 基数 | 名称 | 接頭辞 | 使える数字 | 例(10進の255) |
|---|---|---|---|---|
| 2 | 2進数 | 0b | 0, 1 | 0b11111111 |
| 8 | 8進数 | 0o | 0〜7 | 0o377 |
| 10 | 10進数 | (なし) | 0〜9 | 255 |
| 16 | 16進数 | 0x | 0〜9, A〜F | 0xFF |
0bは binary(2進数)、0oは octal(8進数)、0xは hexadecimal(16進数)の頭文字に由来します。たとえば「0xFF」と書けば、それが16進数の FF(10進数の255)であることが一目で分かります。16進数では9の次をA・B・C・D・E・Fで表し、Fが10進数の15に対応します。
接頭辞は言語によって細かな違いがあります。古いC言語などでは8進数を「0377」のように先頭の0だけで表す流儀もあり、これは「0o377」と同じ意味です。読み間違いを避けるため、現在の多くの言語では明示的な0oが推奨されています。
10進数との相互変換の手順
基数変換は、原理さえ分かれば手計算でもできます。ここでは10進数と2進数の変換を例に、基本の手順を見てみましょう。
10進数 → 2進数(割り算法)
変換したい10進数を、2で割り続け、その余りを下から並べるのが基本です。10進数の13を2進数にしてみます。
- 13 ÷ 2 = 6 余り 1
- 6 ÷ 2 = 3 余り 0
- 3 ÷ 2 = 1 余り 1
- 1 ÷ 2 = 0 余り 1
余りを下から読むと「1101」。つまり10進数の13は2進数で 1101 です。
2進数 → 10進数(重み付け法)
逆向きの変換は、各桁に「基数の累乗の重み」を掛けて合計します。2進数の1101なら次の通りです。
1×2³ + 1×2² + 0×2¹ + 1×2⁰ = 8 + 4 + 0 + 1 = 13
8進数・16進数でも考え方は同じで、割る数(または重み)を8や16に置き換えるだけです。慣れれば暗算でもできますが、桁数が増えるとミスしやすくなります。計算結果の確認や大きな数の変換には、基数変換ツールを使えば、入力した値を2進数・8進数・10進数・16進数へ瞬時に変換できて安心です。
ビットとバイトの関係
2進数の1桁、つまり0か1のどちらかを表す最小単位をビット(bit)と呼びます。1ビットは「オン/オフ」「真/偽」の2通りの情報を表せます。ビットが増えるほど表現できる組み合わせは倍々に増え、nビットあれば 2のn乗通りの値を表せます。
そして、8ビットをひとまとめにした単位がバイト(byte)です。8ビットあれば 2の8乗 = 256通り、つまり0〜255の値を表現できます。これがコンピュータでデータ量を数える基本単位になっており、KB(キロバイト)やMB(メガバイト)もすべてバイトを基準にしています。
| 単位 | ビット数 | 表せる値の数 |
|---|---|---|
| 1ビット | 1 | 2通り(0〜1) |
| 1バイト(8ビット) | 8 | 256通り(0〜255) |
| 2バイト | 16 | 65,536通り |
1バイト(8ビット)がちょうど16進数2桁(00〜FF)で表せる点も重要です。8ビットは16進数の2桁とぴったり対応するため、メモリの中身やバイト列を扱うときに16進数が好んで使われます。この対応関係が、次に説明する16進数の便利さにつながっています。
なぜ16進数が使われるのか
16進数(基数16)がプログラミングの現場で重宝されるのは、2進数と相性が抜群に良く、しかも桁数を短くできるからです。16は2の4乗なので、2進数の4桁がちょうど16進数の1桁に対応します。
2進数 1111 1111 → 16進数 FF(10進数の255)
この性質のおかげで、長くなりがちな2進数を、機械的に4桁ずつ区切るだけで簡単に16進数へ変換できます。逆も同様です。人間にとっては「00000000」より「00」、「11111111」より「FF」のほうがはるかに読みやすく、書き間違いも減ります。
身近な例がWebの色コードです。「#FF0000」は赤、「#00FF00」は緑、「#0000FF」は青を表しますが、これは赤・緑・青それぞれの強さを1バイト(16進2桁、0〜255)で指定したものです。16進数を使うことで、3色の値をわずか6文字でコンパクトに表現できます。ほかにも、メモリアドレスの表示、文字コード、バイナリデータの確認(ダンプ)など、コンピュータの内部を覗くあらゆる場面で16進数は活躍しています。
このように、基数の知識は色指定からデータ解析まで幅広い場面で役立ちます。まずは基数変換ツールで、同じ数が2進数・8進数・16進数でどう表されるかを実際に見比べてみてください。手を動かして対応関係を体感することが、基数を理解する一番の近道です。
なお本記事は一般的な情報の提供を目的としたものです。プログラミング言語ごとの表記や仕様には細かな違いがあるため、実際の開発では最新の公式ドキュメントを確認のうえ判断してください。
よくある質問
基数とは何ですか?
基数とは、数を表すときに何種類の数字を使い、いくつで桁が繰り上がるかを示す値です。普段使う10進数は0〜9の10種類で桁が上がる基数10、2進数は0と1の2種類で桁が上がる基数2です。どの基数でも「各桁が基数の累乗の重みを持つ」という考え方は共通しています。
なぜコンピュータは2進数を使うのですか?
電子回路ではオン/オフ、高電圧/低電圧のように「2つの状態」がもっとも確実に区別できるためです。これを0と1に対応させれば、ノイズに強くシンプルな回路であらゆる情報を表現できます。数値だけでなく文字・画像・音声・プログラムも、最終的には0と1の並びで表されます。
0b・0o・0xはそれぞれ何を意味しますか?
数の基数を区別するための接頭辞です。0bは2進数(binary)、0oは8進数(octal)、0xは16進数(hexadecimal)を表します。たとえば0xFFは16進数のFFで、10進数の255に相当します。接頭辞のない数字は通常10進数として扱われます。
10進数を2進数に変換するにはどうすればいいですか?
基本は「2で割り続け、出た余りを下から並べる」割り算法です。たとえば13なら、13÷2=6余り1、6÷2=3余り0、3÷2=1余り1、1÷2=0余り1となり、下から読んで1101になります。逆に2進数を10進数へ戻すには、各桁に2の累乗の重みを掛けて合計します。
基数変換ツールで入力した値はサーバーに送信されますか?
WAZA TOOLSの基数変換ツールはすべてブラウザ内で処理され、入力した数値がサーバーに送信・保存されることはありません。スマートフォンでも利用でき、何度でも無料で2進数・8進数・10進数・16進数の相互変換ができます。