メインコンテンツへスキップ

← ブログ一覧へ

2進数・10進数・16進数とは?基数の相互変換を完全解説

私たちは指が10本あるので10進数(base 10)で数えます。コンピュータは線が「オンかオフか」なので2進数(base 2)で数えます。プログラマーは2進数を簡潔に書ける16進数(base 16)を好みます。低レイヤーを触るようになると基数の変換は日常作業で、見た目ほど難しくありません。

「基数(base)」とは何か

基数とは「各桁で使える記号の数」と「各位置の重み」のことです:

  • 10進数(10):数字 0–9。位の重みは 1、10、100、1000⋯
  • 2進数(2):数字 0–1。重みは 1、2、4、8、16⋯
  • 8進数(8):数字 0–7。重みは 1、8、64⋯
  • 16進数(16):0–9 に a–f(a=10 ⋯ f=15)。重みは 1、16、256⋯

つまり2進数 1010 = 8 + 0 + 2 + 0 = 10進数の 10、16進数 ff = 15×16 + 15 = 255 です。

なぜ2進数ではなく16進数?

2進数は正確ですが読みにくい——11111111ff16 は 2⁴ なので、16進数の1桁がちょうど2進数の4桁に対応し、16進数は2進数の無損な省略記法になります。だから色(#3388cc)、メモリアドレス(0x7ffe)、Unicode コードポイント(U+1F600)は16進数で書かれます。

唯一の落とし穴:同じ数字でも基数が違えば別の数

10 は10進数で、2進数で、8進数で、16進数で十六です。数字の並びは、それがどの基数かを知るまで意味を持ちません。変換ミスの多くはここ——100 を百だと思ったら実は2進数の四だった、という具合です。

テキストもただのバイト

「テキスト→2進数」が成り立つのは、各文字が(UTF-8 で)バイトとして保存され、各バイトが8ビットだからです。文字 A はバイト 65 = 2進数 01000001 = 16進数 41。絵文字や非ラテン文字は複数バイトになりますが、考え方は同じです。

ブラウザ内で即変換

基数変換ツールは4つの基数を連動させ、どれかに入力すると他が即更新されます。BigInt を使うので巨大な数も正確で、UTF-8 でテキストを2進数や Hex に変換・復元もできます。

関連ツール

早見表

下の表はどの行も同じ数を 4 つの基数で書いたものです。手元に置くと便利です:

10進2進16進8進
0000
81000810
101010A12
151111F17
16100001020
64100000040100
100110010064144
1281000000080200
25511111111FF377
256100000000100400
1024100000000004002000

覚えておく価値があるのは 255 = 0xFF = 0b11111111 の行——1 バイト(8 ビット)が保持できる最大値です。

手で変換する

  • 10進 → 2進: 2 で割り続け、余りを下から読む。13 → 6 余り 1、3 余り 0、1 余り 1、0 余り 11101
  • 2進 → 10進: 各位の重みを足す。1101 = 8 + 4 + 0 + 1 = 13
  • 2進 ↔ 16進: 右から 4 ビットずつまとめる。111111111111 1111F FFF
  • 16進 → 10進: 各桁に 16 のべき乗を掛ける。0x2A = 2×16 + 10 = 42

接頭辞の意味

同じ数字でも基数が違えば別の数になるため、コードは接頭辞で基数を示します:0x は16進(0xFF)、0b は2進(0b1010)、0o(C 言語では先頭の 0)は8進(0o17)。接頭辞がなければ10進です。こうした計算を手でやりたくないときは、CSS カラー形式の実用ガイドが同じ16進を Web の色でどう使うかを示しています。