基数および基数変換について
CREATED: 2026 / 05 / 07 Thu
UPDATED: 2026 / 05 / 07 Thu
基数とは
基数(radix) とは、ある位取り記数法において1桁で表せる値の種類の数のことです。 私たちが日常的に使う 10 進数は 0〜9 の 10 種類の数字を使い、基数は 10 です。
コンピュータの世界では、回路のオン/オフに対応する 2進数(Binary)、8 進数との親和性から利用される 8進数(Octal)、そして 16 進数グループ法から利用される 16進数(Hexadecimal) がよく登場します。
| 記数法 | 基数 | 使用する数字・記号 |
|---|---|---|
| 2 進数 | 2 | 0, 1 |
| 8 進数 | 8 | 0〜7 |
| 10 進数 | 10 | 0〜9 |
| 16 進数 | 16 | 0〜9, A(10), B(11), C(12), D(13), E(14), F(15) |
2進数・8進数・16進数の表現
2進数(Binary)
2 進数は 0 と 1 の 2 種類だけで数を表します。 桁が上がるたびに値が2倍になります。
| 10 進数 | 2 進数 |
|---|---|
| 0 | 0000 |
| 1 | 0001 |
| 2 | 0010 |
| 3 | 0011 |
| 4 | 0100 |
| 5 | 0101 |
| 6 | 0110 |
| 7 | 0111 |
| 8 | 1000 |
表記上は 0b や 0B を先頭に付けるか、末尾に (2) と添えて区別することが多いです(例:0b1010、1010(2))。
8進数(Octal)
8 進数は 0〜7 の 8 種類で数を表します。 3 ビットがちょうど 1 桁の 8 進数に対応するため、2 進数との相互変換が容易です。
| 10 進数 | 8 進数 |
|---|---|
| 0 | 0 |
| 7 | 7 |
| 8 | 10 |
| 15 | 17 |
| 16 | 20 |
| 63 | 77 |
| 64 | 100 |
表記上は先頭に 0 や 0o を付けることが多いです(例:017、0o17)。
16進数(Hexadecimal)
16 進数は 0〜9 と A〜F の 16 種類で数を表します。 4 ビットがちょうど 1 桁の 16 進数に対応するため、バイト列(8 ビット=2桁)の表記によく使われます。
| 10 進数 | 16 進数 |
|---|---|
| 0 | 0 |
| 9 | 9 |
| 10 | A |
| 15 | F |
| 16 | 10 |
| 255 | FF |
| 256 | 100 |
表記上は先頭に 0x や 0X を付けることが多いです(例:0xFF、0x1A)。
n進数から10進数への変換
n 進数の各桁の値に「基数の冪乗」を掛けて総和を求めます。 右端の桁を第0位として、左に行くにつれて指数が1ずつ増えていきます。
各桁の値 × n^(桁の位置) の総和
2進数 → 10進数の例
1101(2) を 10 進数に変換します。
1 × 2^3 + 1 × 2^2 + 0 × 2^1 + 1 × 2^0
= 8 + 4 + 0 + 1
= 13
8進数 → 10進数の例
145(8) を 10 進数に変換します。
1 × 8^2 + 4 × 8^1 + 5 × 8^0
= 64 + 32 + 5
= 101
16進数 → 10進数の例
2F(16) を 10 進数に変換します。
2 × 16^1 + 15 × 16^0
= 32 + 15
= 47
10進数からn進数への変換
10 進数を n 進数に変換するには、商が 0 になるまで基数で割り続け、余りを逆順に並べます。
10進数 ÷ 基数 → 商と余りを記録
商 ÷ 基数 → 商と余りを記録
... 商が 0 になるまで繰り返す
余りを逆順に並べると n進数の表現になる
10進数 → 2進数の例
13 を 2 進数に変換します。
13 ÷ 2 = 商 6 … 余り 1
6 ÷ 2 = 商 3 … 余り 0
3 ÷ 2 = 商 1 … 余り 1
1 ÷ 2 = 商 0 … 余り 1
余りを逆順に: 1101(2)
10進数 → 8進数の例
101 を 8 進数に変換します。
101 ÷ 8 = 商 12 … 余り 5
12 ÷ 8 = 商 1 … 余り 4
1 ÷ 8 = 商 0 … 余り 1
余りを逆順に: 145(8)
10進数 → 16進数の例
47 を 16 進数に変換します。
47 ÷ 16 = 商 2 … 余り 15(F)
2 ÷ 16 = 商 0 … 余り 2
余りを逆順に: 2F(16)
n進数からm進数への変換
10進数を経由する方法(汎用)
任意の n 進数を m 進数に変換する最も汎用的な方法は、一度 10 進数に変換してから m 進数に変換する 2 ステップです。
n進数 → 10進数 → m進数
たとえば 1101(2) を 8 進数に変換する場合は次の通りです。
1101(2) → 13(10) → 15(8)
2進数と8進数の直接変換(3桁グループ法)
2 進数 3 桁がちょうど 8 進数 1 桁に対応します。 そのため、右端から 3 ビットずつグループにして変換できます。
101110(2) を 8 進数に変換します。
101 110
5 6
= 56(8)
逆に 56(8) を 2 進数に変換する場合は、各桁を 3 ビット 2 進数に展開します。
5 → 101
6 → 110
= 101110(2)
2進数と16進数の直接変換(4桁グループ法)
2 進数 4 桁がちょうど 16 進数 1 桁に対応します。 右端から 4 ビットずつグループにして変換できます。
10111110(2) を 16 進数に変換します。
1011 1110
B E
= BE(16)
逆に BE(16) を 2 進数に変換する場合は、各桁を 4 ビット 2 進数に展開します。
B(11) → 1011
E(14) → 1110
= 10111110(2)
四則演算
加算
2 進数の加算は 10 進数と同様に桁ごとに足し合わせ、基数(2)以上になったら上の桁に繰り上げます。
繰り上げルール:
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10(0を書いて1を繰り上げ)
例:0101(2) + 0011(2) を計算します。
0 1 0 1
+ 0 0 1 1
---------
1 0 0 0
10 進数で確認すると、5 + 3 = 8 = 1000(2) です。
8 進数・16 進数も同様に、各桁の和が基数以上になったら繰り上げます。
減算
2 進数の減算では、引けない桁が生じたときに上の桁から借り(borrow)ます。 上の桁から 1 借りると、現在の桁では基数(2)分の値が加算されます。
例:1000(2) - 0011(2) を計算します。
1 0 0 0
- 0 0 1 1
---------
0 1 0 1
10 進数で確認すると、8 - 3 = 5 = 0101(2) です。
乗算・除算
2 進数の乗算は、1 桁の乗算と桁シフトの組み合わせです。 各桁に掛けた部分積を位置をずらして加算します。
例:0101(2) × 0011(2) を計算します。
0 1 0 1 (= 5)
× 0 0 1 1 (= 3)
---------
0 1 0 1 (0101 × 1、0桁シフト)
0 1 0 1 0 (0101 × 1、1桁シフト)
---------
0 1 1 1 1 (= 15)
除算は商と余りを求める長除算で行います。
小数の扱い
10進小数と2進小数の変換
10進小数 → 2進小数
整数部は前述の「10進数 → n進数変換」と同じですが、小数部は異なる手法を使います。 小数部を 2 倍し、1以上になれば 1、ならなければ 0 を記録。小数部が 0 になるまで繰り返します。
例:0.625 を 2 進数に変換します。
0.625 × 2 = 1.25 → 1(整数部を取り出し、残りの 0.25 で続ける)
0.25 × 2 = 0.5 → 0
0.5 × 2 = 1.0 → 1(小数部が 0 になったので終了)
上から順に並べると: 0.101(2)
確認:1 × 2^(-1) + 0 × 2^(-2) + 1 × 2^(-3) = 0.5 + 0 + 0.125 = 0.625
なお、10 進小数のすべてが有限の 2 進小数で表せるとは限りません。
たとえば 0.1(10) は 2 進数では 0.0001100110011...(2) と無限循環小数になります。
これがプログラミングにおける浮動小数点数の誤差の原因のひとつです。
2進小数 → 10進小数
各桁に 2^(-n) を掛けて総和を求めます(n は小数点以下の桁位置)。
例:0.1011(2) を 10 進数に変換します。
1 × 2^(-1) + 0 × 2^(-2) + 1 × 2^(-3) + 1 × 2^(-4)
= 0.5 + 0 + 0.125 + 0.0625
= 0.6875
シフト演算による小数計算
シフト演算は乗除算の高速な代替手段としてよく使われます。
- 左シフト(
<<)n ビット → 2^n 倍(掛け算) - 右シフト(
>>)n ビット → 2^(-n) 倍(割り算)
例:0101(2)(= 5) を 1 ビット左シフトすると 1010(2)(= 10) になります。
0 1 0 1 (5)
左シフト 1ビット
1 0 1 0 (10 = 5 × 2)
例:1000(2)(= 8) を 2 ビット右シフトすると 0010(2)(= 2) になります。
1 0 0 0 (8)
右シフト 2ビット
0 0 1 0 (2 = 8 ÷ 4)
整数を扱う場合、右シフトは小数部を切り捨てた整数除算になる点に注意が必要です。
たとえば 0101(2)(= 5) を 1 ビット右シフトすると 0010(2)(= 2) となり、余りの 1 は失われます。
を仕舞い
参考資料📕