2進数(バイナリ)、10進数(デシマル)、16進数(ヘキサ)の相互変換は、プログラミングにおける数値処理の大前提です。
本記事では、基礎概念と表記ルールから、手計算の手順、主要言語での変換関数、0〜255の変換表、暗算のコツや検算方法までを丁寧にまとめました。
実務で迷わないための実用的な視点で解説します。
2進数・10進数・16進数の基礎

基数と桁の重み
数値は位置(桁)と基数(ベース)によって表されます。
右端の桁から順に、それぞれの基数の累乗を重みとして掛け合わせ、総和を取ったものがその数の値になります。
- 10進数は基数10で、各桁の重みは…1000(10の3乗)、100(10の2乗)、10、1です。
- 2進数は基数2で、各桁の重みは…128(2の7乗)、64、32、16、8、4、2、1です。
- 16進数は基数16で、各桁の重みは…4096(16の3乗)、256、16、1です。
例として、2進数の1101(2)は、8+4+0+1=13(10)です。
16進数の「A」は10、「F」は15を表します。
たとえば0x1A3(16)は、1×256+10×16+3=419(10)です。
表記ルールと接頭辞 0b 0x
プログラミングでは、数値リテラルの基数を明示するための接頭辞がよく使われます。
- 2進数には接頭辞0bを付けます(例: 0b1010)。
- 16進数には接頭辞0xを付けます(例: 0xFF)。
- 10進数は接頭辞なしが一般的です。
16進の桁は0〜9とA〜Fを用います(A〜Fはa〜fでも可)。
桁の区切りやゼロ埋めは可読性と用途に合わせます。
たとえばバイト(8ビット)を意識して2進数を8桁にゼロ埋めすることがあります(例: 00001010)。
また、言語によっては数値リテラルにアンダースコアで桁区切りを入れられます(例: 0b1111_0000、1_000_000)。
注意点として、歴史的に一部の言語や処理系では先頭0が付く数値を8進数と解釈する仕様がありました。
現在は明示的な接頭辞(0b、0x、0o)や関数の基数引数を正しく指定することで誤解釈を避けられます。
参考までに主要言語の表記をまとめます。
言語 | 2進リテラル | 16進リテラル | 備考 |
---|---|---|---|
Python | 0b1010 | 0xFF | 整数→文字列の変換やゼロ埋めが充実 |
JavaScript | 0b1010 | 0xFF | parseIntは必ず基数を指定するのが安全 |
Java | 0b1010 | 0xFF | Java 7以降で0bが利用可能 |
C++ | 0b1010 | 0xFF | C++14以降で0bが標準化 |
C | (処理系依存の0b) | 0xFF | 標準Cでは0bは未対応のものが多い |
プログラミングでの変換関数
言語ごとの代表的な変換方法を示します。
Python
n = 42
# 10進→2進/16進 (文字列)
bin_str = format(n, 'b') # '101010'
bin8 = format(n, '08b') # '00101010' (8ビットゼロ埋め)
hex_str = format(n, 'x') # '2a'
hex2 = format(n, '02X') # '2A' (大文字2桁)
# 文字列→10進 (指定基数)
d1 = int('1010', 2) # 10
d2 = int('FF', 16) # 255
JavaScript
const n = 42;
// 10進→2進/16進
const bin = n.toString(2); // '101010'
const bin8 = bin.padStart(8, '0'); // '00101010'
const hex = n.toString(16).toUpperCase(); // '2A'
// 文字列→10進 (基数は必ず明示)
const d1 = parseInt('1010', 2); // 10
const d2 = parseInt('FF', 16); // 255
// リテラル
const a = 0b1010; // 10
const b = 0xFF; // 255
C/C++
// C++14以降
#include <bitset>
#include <iostream>
#include <string>
int n = 42;
// 10進→2進(8ビット文字列)
std::string bin8 = std::bitset<8>(n).to_string(); // "00101010"
// 10進→16進 表示
std::cout << std::hex << std::uppercase << n; // "2A"
// 文字列→10進
int d1 = std::stoi("1010", nullptr, 2); // 10
int d2 = std::stoi("FF", nullptr, 16); // 255
// C言語の例 (16進表示)
#include <stdio.h>
int m = 255;
printf("%02X\n", m); // "FF"
// C言語には2進表示の書式はありません(自作またはビット演算で対応)
Java
int n = 42;
// 10進→2進/16進
String bin = Integer.toBinaryString(n); // "101010"
String bin8 = String.format("%8s", bin).replace(' ', '0'); // "00101010"
String hex = Integer.toHexString(n).toUpperCase(); // "2A"
// 文字列→10進
int d1 = Integer.parseInt("1010", 2); // 10
int d2 = Integer.parseInt("FF", 16); // 255
進数変換の基本
10進から2進への変換
もっとも基本的な手順は「2で割って余りを取る」を繰り返し、余りを下から上へ並べる方法です。
例として45(10)を2進数にします。
商 | 余り |
---|---|
45 ÷ 2 = 22 | 1 |
22 ÷ 2 = 11 | 0 |
11 ÷ 2 = 5 | 1 |
5 ÷ 2 = 2 | 1 |
2 ÷ 2 = 1 | 0 |
1 ÷ 2 = 0 | 1 |
余りを下から並べると「101101」なので、45(10) = 101101(2)です。
別法として「2のべき乗の引き算」を使うと暗算が速くなります。
45に最も近い2のべき乗は32(2の5乗)なので、45-32=13、次は8、4、1…と選んでいくと、32+8+4+1で101101(2)と分かります。
10進から16進への変換
「16で割って余りを取る」を繰り返す方法が基本です。
例として201(10)を16進にします。
- 201 ÷ 16 = 12 余り 9 → 下位桁は9
- 12 ÷ 16 = 0 余り 12 → 上位桁はC(12)
よって201(10) = 0xC9(16)です。
先に2進へ変換し、4ビットずつ区切って16進に読み替える方法もよく使います。
2進から10進への変換
各桁に対応する重み(2のべき乗)を足し合わせます。
101101(2)は、32+8+4+1=45(10)です。
桁を左から右へ読むときは、累積値を2倍して次のビット(0/1)を加える方法も有効です。
16進から10進への変換
各桁の重みは16のべき乗です。
0x1A3は、1×256+10×16+3=419(10)です。
桁を左から右へ読むときは、累積値を16倍して次の桁値を加える手順にすると、桁数が多くても手早く計算できます。
2進と16進の相互変換
2進と16進の間は4ビット(ニブル)単位で厳密に対応します。
次の対応を覚えると高速です。
16進 | 2進(4ビット) | 16進 | 2進(4ビット) |
---|---|---|---|
0 | 0000 | 8 | 1000 |
1 | 0001 | 9 | 1001 |
2 | 0010 | A | 1010 |
3 | 0011 | B | 1011 |
4 | 0100 | C | 1100 |
5 | 0101 | D | 1101 |
6 | 0110 | E | 1110 |
7 | 0111 | F | 1111 |
例: 1101 0110 1111(2) → D 6 F → 0xD6F。
左端の桁数が4の倍数に満たないときは左側を0で埋めてから対応させます(例: 11(2) → 0011 → 0x3)。
2進数・10進数・16進数の変換表
0〜15の変換表
基本の対応を4ビット単位で確認します。
10進 | 16進 | 2進(4ビット) |
---|---|---|
0 | 0x0 | 0000 |
1 | 0x1 | 0001 |
2 | 0x2 | 0010 |
3 | 0x3 | 0011 |
4 | 0x4 | 0100 |
5 | 0x5 | 0101 |
6 | 0x6 | 0110 |
7 | 0x7 | 0111 |
8 | 0x8 | 1000 |
9 | 0x9 | 1001 |
10 | 0xA | 1010 |
11 | 0xB | 1011 |
12 | 0xC | 1100 |
13 | 0xD | 1101 |
14 | 0xE | 1110 |
15 | 0xF | 1111 |
0〜255の変換表
バイト(8ビット)の範囲で、10進・16進・2進の対応を示します。
2進は8ビットでゼロ埋めしています。
10進 | 16進 | 2進 8ビット | 10進 | 16進 | 2進 8ビット | 10進 | 16進 | 2進 8ビット |
---|---|---|---|---|---|---|---|---|
0 | 0x00 | 00000000 | 85 | 0x55 | 01010101 | 170 | 0xAA | 10101010 |
1 | 0x01 | 00000001 | 86 | 0x56 | 01010110 | 171 | 0xAB | 10101011 |
2 | 0x02 | 00000010 | 87 | 0x57 | 01010111 | 172 | 0xAC | 10101100 |
3 | 0x03 | 00000011 | 88 | 0x58 | 01011000 | 173 | 0xAD | 10101101 |
4 | 0x04 | 00000100 | 89 | 0x59 | 01011001 | 174 | 0xAE | 10101110 |
5 | 0x05 | 00000101 | 90 | 0x5A | 01011010 | 175 | 0xAF | 10101111 |
6 | 0x06 | 00000110 | 91 | 0x5B | 01011011 | 176 | 0xB0 | 10110000 |
7 | 0x07 | 00000111 | 92 | 0x5C | 01011100 | 177 | 0xB1 | 10110001 |
8 | 0x08 | 00001000 | 93 | 0x5D | 01011101 | 178 | 0xB2 | 10110010 |
9 | 0x09 | 00001001 | 94 | 0x5E | 01011110 | 179 | 0xB3 | 10110011 |
10 | 0x0A | 00001010 | 95 | 0x5F | 01011111 | 180 | 0xB4 | 10110100 |
11 | 0x0B | 00001011 | 96 | 0x60 | 01100000 | 181 | 0xB5 | 10110101 |
12 | 0x0C | 00001100 | 97 | 0x61 | 01100001 | 182 | 0xB6 | 10110110 |
13 | 0x0D | 00001101 | 98 | 0x62 | 01100010 | 183 | 0xB7 | 10110111 |
14 | 0x0E | 00001110 | 99 | 0x63 | 01100011 | 184 | 0xB8 | 10111000 |
15 | 0x0F | 00001111 | 100 | 0x64 | 01100100 | 185 | 0xB9 | 10111001 |
16 | 0x10 | 00010000 | 101 | 0x65 | 01100101 | 186 | 0xBA | 10111010 |
17 | 0x11 | 00010001 | 102 | 0x66 | 01100110 | 187 | 0xBB | 10111011 |
18 | 0x12 | 00010010 | 103 | 0x67 | 01100111 | 188 | 0xBC | 10111100 |
19 | 0x13 | 00010011 | 104 | 0x68 | 01101000 | 189 | 0xBD | 10111101 |
20 | 0x14 | 00010100 | 105 | 0x69 | 01101001 | 190 | 0xBE | 10111110 |
21 | 0x15 | 00010101 | 106 | 0x6A | 01101010 | 191 | 0xBF | 10111111 |
22 | 0x16 | 00010110 | 107 | 0x6B | 01101011 | 192 | 0xC0 | 11000000 |
23 | 0x17 | 00010111 | 108 | 0x6C | 01101100 | 193 | 0xC1 | 11000001 |
24 | 0x18 | 00011000 | 109 | 0x6D | 01101101 | 194 | 0xC2 | 11000010 |
25 | 0x19 | 00011001 | 110 | 0x6E | 01101110 | 195 | 0xC3 | 11000011 |
26 | 0x1A | 00011010 | 111 | 0x6F | 01101111 | 196 | 0xC4 | 11000100 |
27 | 0x1B | 00011011 | 112 | 0x70 | 01110000 | 197 | 0xC5 | 11000101 |
28 | 0x1C | 00011100 | 113 | 0x71 | 01110001 | 198 | 0xC6 | 11000110 |
29 | 0x1D | 00011101 | 114 | 0x72 | 01110010 | 199 | 0xC7 | 11000111 |
30 | 0x1E | 00011110 | 115 | 0x73 | 01110011 | 200 | 0xC8 | 11001000 |
31 | 0x1F | 00011111 | 116 | 0x74 | 01110100 | 201 | 0xC9 | 11001001 |
32 | 0x20 | 00100000 | 117 | 0x75 | 01110101 | 202 | 0xCA | 11001010 |
33 | 0x21 | 00100001 | 118 | 0x76 | 01110110 | 203 | 0xCB | 11001011 |
34 | 0x22 | 00100010 | 119 | 0x77 | 01110111 | 204 | 0xCC | 11001100 |
35 | 0x23 | 00100011 | 120 | 0x78 | 01111000 | 205 | 0xCD | 11001101 |
36 | 0x24 | 00100100 | 121 | 0x79 | 01111001 | 206 | 0xCE | 11001110 |
37 | 0x25 | 00100101 | 122 | 0x7A | 01111010 | 207 | 0xCF | 11001111 |
38 | 0x26 | 00100110 | 123 | 0x7B | 01111011 | 208 | 0xD0 | 11010000 |
39 | 0x27 | 00100111 | 124 | 0x7C | 01111100 | 209 | 0xD1 | 11010001 |
40 | 0x28 | 00101000 | 125 | 0x7D | 01111101 | 210 | 0xD2 | 11010010 |
41 | 0x29 | 00101001 | 126 | 0x7E | 01111110 | 211 | 0xD3 | 11010011 |
42 | 0x2A | 00101010 | 127 | 0x7F | 01111111 | 212 | 0xD4 | 11010100 |
43 | 0x2B | 00101011 | 128 | 0x80 | 10000000 | 213 | 0xD5 | 11010101 |
44 | 0x2C | 00101100 | 129 | 0x81 | 10000001 | 214 | 0xD6 | 11010110 |
45 | 0x2D | 00101101 | 130 | 0x82 | 10000010 | 215 | 0xD7 | 11010111 |
46 | 0x2E | 00101110 | 131 | 0x83 | 10000011 | 216 | 0xD8 | 11011000 |
47 | 0x2F | 00101111 | 132 | 0x84 | 10000100 | 217 | 0xD9 | 11011001 |
48 | 0x30 | 00110000 | 133 | 0x85 | 10000101 | 218 | 0xDA | 11011010 |
49 | 0x31 | 00110001 | 134 | 0x86 | 10000110 | 219 | 0xDB | 11011011 |
50 | 0x32 | 00110010 | 135 | 0x87 | 10000111 | 220 | 0xDC | 11011100 |
51 | 0x33 | 00110011 | 136 | 0x88 | 10001000 | 221 | 0xDD | 11011101 |
52 | 0x34 | 00110100 | 137 | 0x89 | 10001001 | 222 | 0xDE | 11011110 |
53 | 0x35 | 00110101 | 138 | 0x8A | 10001010 | 223 | 0xDF | 11011111 |
54 | 0x36 | 00110110 | 139 | 0x8B | 10001011 | 224 | 0xE0 | 11100000 |
55 | 0x37 | 00110111 | 140 | 0x8C | 10001100 | 225 | 0xE1 | 11100001 |
56 | 0x38 | 00111000 | 141 | 0x8D | 10001101 | 226 | 0xE2 | 11100010 |
57 | 0x39 | 00111001 | 142 | 0x8E | 10001110 | 227 | 0xE3 | 11100011 |
58 | 0x3A | 00111010 | 143 | 0x8F | 10001111 | 228 | 0xE4 | 11100100 |
59 | 0x3B | 00111011 | 144 | 0x90 | 10010000 | 229 | 0xE5 | 11100101 |
60 | 0x3C | 00111100 | 145 | 0x91 | 10010001 | 230 | 0xE6 | 11100110 |
61 | 0x3D | 00111101 | 146 | 0x92 | 10010010 | 231 | 0xE7 | 11100111 |
62 | 0x3E | 00111110 | 147 | 0x93 | 10010011 | 232 | 0xE8 | 11101000 |
63 | 0x3F | 00111111 | 148 | 0x94 | 10010100 | 233 | 0xE9 | 11101001 |
64 | 0x40 | 01000000 | 149 | 0x95 | 10010101 | 234 | 0xEA | 11101010 |
65 | 0x41 | 01000001 | 150 | 0x96 | 10010110 | 235 | 0xEB | 11101011 |
66 | 0x42 | 01000010 | 151 | 0x97 | 10010111 | 236 | 0xEC | 11101100 |
67 | 0x43 | 01000011 | 152 | 0x98 | 10011000 | 237 | 0xED | 11101101 |
68 | 0x44 | 01000100 | 153 | 0x99 | 10011001 | 238 | 0xEE | 11101110 |
69 | 0x45 | 01000101 | 154 | 0x9A | 10011010 | 239 | 0xEF | 11101111 |
70 | 0x46 | 01000110 | 155 | 0x9B | 10011011 | 240 | 0xF0 | 11110000 |
71 | 0x47 | 01000111 | 156 | 0x9C | 10011100 | 241 | 0xF1 | 11110001 |
72 | 0x48 | 01001000 | 157 | 0x9D | 10011101 | 242 | 0xF2 | 11110010 |
73 | 0x49 | 01001001 | 158 | 0x9E | 10011110 | 243 | 0xF3 | 11110011 |
74 | 0x4A | 01001010 | 159 | 0x9F | 10011111 | 244 | 0xF4 | 11110100 |
75 | 0x4B | 01001011 | 160 | 0xA0 | 10100000 | 245 | 0xF5 | 11110101 |
76 | 0x4C | 01001100 | 161 | 0xA1 | 10100001 | 246 | 0xF6 | 11110110 |
77 | 0x4D | 01001101 | 162 | 0xA2 | 10100010 | 247 | 0xF7 | 11110111 |
78 | 0x4E | 01001110 | 163 | 0xA3 | 10100011 | 248 | 0xF8 | 11111000 |
79 | 0x4F | 01001111 | 164 | 0xA4 | 10100100 | 249 | 0xF9 | 11111001 |
80 | 0x50 | 01010000 | 165 | 0xA5 | 10100101 | 250 | 0xFA | 11111010 |
81 | 0x51 | 01010001 | 166 | 0xA6 | 10100110 | 251 | 0xFB | 11111011 |
82 | 0x52 | 01010010 | 167 | 0xA7 | 10100111 | 252 | 0xFC | 11111100 |
83 | 0x53 | 01010011 | 168 | 0xA8 | 10101000 | 253 | 0xFD | 11111101 |
84 | 0x54 | 01010100 | 169 | 0xA9 | 10101001 | 254 | 0xFE | 11111110 |
85 | 0x55 | 01010101 | 170 | 0xAA | 10101010 | 255 | 0xFF | 11111111 |
2のべき乗の早見表
暗算や検算でよく使う2のべき乗をまとめました。
n | 2のべき乗(2^n) | 備考 |
---|---|---|
0 | 1 | |
1 | 2 | |
2 | 4 | |
3 | 8 | |
4 | 16 | |
5 | 32 | |
6 | 64 | |
7 | 128 | 1バイトの最上位ビット |
8 | 256 | 1バイトの桁あふれ境界 |
9 | 512 | |
10 | 1024 | 約1KB |
11 | 2048 | |
12 | 4096 | 4KB(ページサイズの目安) |
13 | 8192 | |
14 | 16384 | |
15 | 32768 | |
16 | 65536 | 約64KB |
20 | 1048576 | 約1MB |
24 | 16777216 | 約16MB |
30 | 1073741824 | 約1GB |
32 | 4294967296 | 32ビット無符号の最大+1 |
必要に応じて、16のべき乗(=2の4の倍数)も覚えると16進との行き来が快適です。
たとえば16^2=256、16^3=4096、16^4=65536です。
計算のコツと検算
4ビット単位で考える
2進と16進は4ビット(ニブル)で1桁対応します。
バイト(8ビット)は上位ニブルと下位ニブルの組で、16進2桁に対応します。
たとえば0xAFは、上位ニブルA(1010)と下位ニブルF(1111)で、2進では1010 1111となります。
桁数が多いときこそ「4ビットずつに切る」ことで、見間違いや位取りのミスを減らせます。
2のべき乗を素早く使う
2進→10進では、128 64 32 16 8 4 2 1のどれが立っているかを見て合計します。
10進→2進では、対象の数から最大の2のべき乗を順に引いていくと素早く求められます。
16進→2進は各桁を4ビットに展開するだけなので、A(1010)、C(1100)、F(1111)などよく出るパターンを体で覚えると正確さが上がります。
よくあるミスと対策
- 基数の指定忘れで誤変換になることがよくあります。parseIntやstoiなどでは必ず基数(2や16)を明示します。
- 左端のゼロの扱いに注意します。特に2進を8ビットや16ビットで扱う場合はゼロ埋めを徹底します(例: 1010 → 00001010)。
- 16進の大文字小文字は値に影響しませんが、出力の仕様(大文字/小文字)は揃えます(例: “%02X”やtoUpperCase)。
- C言語では2進の入出力が標準書式で用意されていません。自作関数やビット演算、またはデバッガ/ライブラリの補助を使います。
- 10進→2進の手計算で余りの並べ順を逆にするミスが起きがちです。余りは下から上へ並べる点を意識します。
検算は「元の基数へ戻す」ことが最も確実です。
たとえば10進→2進にしたら、2進→10進で合計して元の数に戻るかを確認します。
プログラムでは二重変換や、独立した別実装(例: 別言語や標準関数)でクロスチェックすると安心です。
まとめ
2進数・10進数・16進数の相互変換は、アルゴリズム理解から入出力の実装、デバッグや性能チューニングに至るまで幅広く役立ちます。
基数と桁の重み、接頭辞(0b/0x)などの表記ルール、手計算の基本手順を押さえ、主要言語の変換関数を正しく使えるようになれば、日々の開発での迷いが減ります。
0〜255の変換表や2のべき乗の早見表は、暗算や検算の強い味方です。
まずは4ビット単位の読み替えと2のべき乗の感覚を身につけ、確実な変換と素早い検算ができる力を養っていきましょう。