1. 数の表現

1.1. 10進法(10進表現)

ふだん私たちが使っている数の表現です。1つの桁に 0〜9 の10種類の記号を用います。各桁の値は基数(base、radix)の冪に対応します。

\[[1984]_{10} = \mathbf{1} \times 10^3 + \mathbf{9} \times 10^2 + \mathbf{8} \times 10^1 + \mathbf{4} \times 10^0\]
表 1. 10進表現 [1984]₁₀ の桁と重み

1

9

8

4

1000

100

10

1

  • 表現と意味は別モノ:[1984]₁₀ は「10進表現された数 1984」を表す

  • 10進表現 \(n\) 桁で表現できる数の範囲:\(0 \;\sim\; 10^n - 1\)(例:3桁では 0〜999)

1.2. 2進法(2進表現)

コンピューター等で使われている数の表現です。スイッチの on/off に対応し、1つの桁に 0 と 1 の2種類の記号のみを用います。

\[[1010]_2 = \mathbf{1} \times 2^3 + \mathbf{0} \times 2^2 + \mathbf{1} \times 2^1 + \mathbf{0} \times 2^0 = 8 + 2 = 10\]
表 2. 2進表現 [1010]₂ の桁と重み

1

0

1

0

8

4

2

1

  • 2進表現 \(n\) 桁で表現できる数の範囲:\(0 \;\sim\; 2^n - 1\)(例:3桁では 0〜7)

  • 2進表現の1桁 = bit(binary digit)

1.3. n進表現

一般に1つの桁に n 種類の記号を用いる数の表現を n進法といい、n を基数(base、radix)といいます。

表 3. 基数の異なる数の対応表
10進 2進 3進 4進 8進 16進

0

0

0

0

0

0

1

1

1

1

1

1

2

10

2

2

2

2

3

11

10

3

3

3

4

100

11

10

4

4

5

101

12

11

5

5

6

110

20

12

6

6

7

111

21

13

7

7

8

1000

22

20

10

8

9

1001

100

21

11

9

10

1010

101

22

12

A

11

1011

102

23

13

B

12

1100

110

30

14

C

13

1101

111

31

15

D

14

1110

112

32

16

E

15

1111

120

33

17

F

16

10000

121

100

20

10

16進表現では1桁に16種類の記号が必要なため、0〜9 に加えて A〜F の文字を用います(A=10, B=11, …, F=15)。

2進表現のコンパクトな表現として 16進表現がよく使われます:

  • 16進表現の1桁 = 4進表現の2桁 = 2進表現の4桁(\(2^4 = 16\))

  • 8進表現の1桁 = 2進表現の3桁(\(2^3 = 8\))

\[[1011\ 1001]_2 = [B9]_{16}\]

2. 基数変換

2.1. 2進表現から10進表現へ

2.1.1. 整数部の変換:重みを使う方法

各桁の値と桁の重み(2のべき乗)の積の和として求めます。

表 4. 例:[110101]₂ → 10進表現

1

1

0

1

0

1

\(2^5\)

\(2^4\)

\(2^3\)

\(2^2\)

\(2^1\)

\(2^0\)

32

16

8

4

2

1

\[32 + 16 + 4 + 1 = 53\]

よって \({[110101]}_2 = {[53]}_{10}\)

2.1.2. 整数部の変換:Horner法

上位桁から「基数の2を掛けて次の桁を足す」操作を繰り返します。

\[[110101]_2 = ((((1 \times 2 + 1) \times 2 + 0) \times 2 + 1) \times 2 + 0) \times 2 + 1 = 53\]
表 7. 例:[110101]₂ → [53]₁₀(Horner法)
表 5. 2進
 操作

 1×2+1

3

 3×2+0

6

 6×2+1

13

 13×2+0

26

 26×2+1

53

表 6. 10進との対応
 操作

 5×10+3

53

10進表現の場合も同様に「上位桁から基数の10を掛けて次の桁を足す」ことで元の値が得られることがわかります。

2.1.3. 小数部の変換:重みを使う方法

小数点以下の各桁の重みは \(2^{-1},\, 2^{-2},\, 2^{-3},\, \ldots\) となります。

表 8. 例:[0.1011]₂ → 10進表現

.1

0

1

1

\(2^{-1}\)

\(2^{-2}\)

\(2^{-3}\)

\(2^{-4}\)

0.5

0.25

0.125

0.0625

\[0.5 + 0.125 + 0.0625 = 0.6875\]

よって \({[0.1011]}_2 = {[0.6875]}_{10}\)

2.1.4. 小数部の変換:Horner法(逆方向)

下位桁から「基数の2で割って次の桁(上位側)を足す」操作を繰り返します。整数部のHorner法と方向が逆になります。

表 11. 例:[0.1011]₂ → [0.6875]₁₀(Horner法)
表 9. 2進(下位桁から)
 操作

 1÷2+1

1.5

 1.5÷2+0

0.75

 0.75÷2+1

1.375

 1.375÷2

0.6875

表 10. 10進との対応
 操作

 5÷10+7

7.5

 7.5÷10+8

8.75

 8.75÷10+6

6.875

 6.875÷10

0.6875

練習問題(2進 → 10進・16進)

問1)\({[1011110]}_2\) を10進表現に変換せよ

問2)\({[1011110]}_2\) を16進表現に変換せよ

問3)\({[11010111.011]}_2\) を10進表現に変換せよ

問4)\({[11010111.011]}_2\) を16進表現に変換せよ

2.2. 10進表現から2進表現へ

2.2.1. 整数部の変換:2の冪による分解法

変換する数を、それ以下で最大の2の冪から順に「詰めて」いきます。使った2の冪に対応するビットを1とし、使わなかったビットを0とします。

例:[53]₁₀ → 2進表現

53 以下で最大の2の冪は \(2^5 = 32\)。大きい順に順次差し引きます: \(53 - 32 = 21 \;\to\; 21 - 16 = 5 \;\to\; 5 - 4 = 1 \;\to\; 1 - 1 = 0\)

表 12. 53 の2の冪への分解

10進

2進

32

100000

= \(2^5\)

16

010000

= \(2^4\)

4

000100

= \(2^2\)

1

000001

= \(2^0\)

53

110101

よって \({[53]}_{10} = {[110101]}_2\)

2.2.2. 整数部の変換:繰り返し除算法

基数の2で0になるまで繰り返し割り、余りを下から順に並べます。

この方法は、整数の各桁を1つずつ求めていく手順として理解できます。

表 15. 例:[53]₁₀ → [110101]₂(繰り返し除算法)
表 13. 10進の割り算
 10進

余り

 53÷2 = 26

1

 26÷2 = 13

0

 13÷2 = 6

1

  6÷2 = 3

0

  3÷2 = 1

1

  1÷2 = 0

1

表 14. 2進での意味
 2進

余り

 110101÷10 = 11010

1

  11010÷10 = 1101

0

   1101÷10 = 110

1

    110÷10 = 11

0

     11÷10 = 1

1

      1÷10 = 0

1

余りを下から上の順に並べると:1 1 0 1 0 1 → \({[110101]}_2\)

整数部のHorner法(2→10方向)が「上位桁から掛けて足す」なのに対し、この除算法は「下位桁から1桁ずつ取り出す」逆の手順に対応しています。

2.2.3. 小数部の変換:繰り返し乗算法

小数部に2を掛け、整数部(0 または 1)を記録し、小数部が0になるまで繰り返します。整数部を上から順に並べます。

表 16. 繰り返し乗算による変換 [0.671875]₁₀ → [0.101011]₂

計算

整数部

 0.671875 × 2 = *1*.34375

1

 0.34375  × 2 = *0*.6875

0

 0.6875   × 2 = *1*.375

1

 0.375    × 2 = *0*.75

0

 0.75     × 2 = *1*.5

1

 0.5      × 2 = *1*.0

1

整数部を上から順に並べると:1 0 1 0 1 1 → \({[0.101011]}_2\)

10進の小数がすべて有限桁の2進小数になるわけではありません。\(0.1_{10}\) は2進表現すると無限循環小数になります。これは、コンピューター上での浮動小数点演算における「表現誤差」の原因の1つです(次回以降の授業で扱います)。

練習問題(10進 → 2進・16進)

問5)\({[183]}_{10}\) を2進表現と16進表現に変換せよ

問6)\({[137]}_{10}\) を2進表現と16進表現に変換せよ

問7)\({[0.90625]}_{10}\) を2進表現と16進表現に変換せよ

問8)\({[0.1]}_{10}\) を2進表現と16進表現に変換せよ


← 目次へ戻る

© 久保山哲二 「コンピューター科学概論」講義資料 — CC BY-NC-SA 4.0 (表示 - 非営利 - 継承)で公開しています。