header image

枝折

基数および基数変換について

CS

CREATED: 2026 / 05 / 07 Thu

UPDATED: 2026 / 05 / 07 Thu

2進数・8進数・16進数の表現から変換・四則演算・小数まで整理してみました。

基数とは

基数(radix) とは、ある位取り記数法において1桁で表せる値の種類の数のことです。 私たちが日常的に使う 10 進数は 0〜9 の 10 種類の数字を使い、基数は 10 です。

コンピュータの世界では、回路のオン/オフに対応する 2進数(Binary)、8 進数との親和性から利用される 8進数(Octal)、そして 16 進数グループ法から利用される 16進数(Hexadecimal) がよく登場します。

記数法基数使用する数字・記号
2 進数20, 1
8 進数80〜7
10 進数100〜9
16 進数160〜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 進数
00000
10001
20010
30011
40100
50101
60110
70111
81000

表記上は 0b0B を先頭に付けるか、末尾に (2) と添えて区別することが多いです(例:0b10101010(2))。

8進数(Octal)

8 進数は 0〜7 の 8 種類で数を表します。 3 ビットがちょうど 1 桁の 8 進数に対応するため、2 進数との相互変換が容易です。

10 進数8 進数
00
77
810
1517
1620
6377
64100

表記上は先頭に 00o を付けることが多いです(例:0170o17)。

16進数(Hexadecimal)

16 進数は 0〜9 と A〜F の 16 種類で数を表します。 4 ビットがちょうど 1 桁の 16 進数に対応するため、バイト列(8 ビット=2桁)の表記によく使われます。

10 進数16 進数
00
99
10A
15F
1610
255FF
256100

表記上は先頭に 0x0X を付けることが多いです(例:0xFF0x1A)。

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 は失われます。

を仕舞い

参考資料📕