[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

コンピュータIIL(情報科学入門)第2回

目次 索引
2.1 数値の表現
2.1.1 データの表現
2.1.2 2進数
2.1.3 2進数の四則演算
2.1.4 負数の表現
2.2 演習2
2.3 レポート課題
2.4 参考文献
1の補数  オーバーフロー  基数  位取り  16進数  10進数  絶対値表現  2進10進変換  2進数  2進符号  2の補数  バイト  8進数  ビット  補数表現 

2.1 数値の表現

2.1.1 データの表現

前回、情報科学は情報の構造や処理に関する学問であると言いました。 今日は、その第一歩として、コンピュータの内部では、データはどのように表現されるのかについて説明します。

コンピュータが扱うデータの単位はビットです。 ビットbit )とは、2種類の区別できる物理量や概念、記号のことです。 例えば、物理量では電圧の有無、概念では真偽、記号では0と1がビットです。

コンピュータの内部では、データはすべてビットの列によって表現されます。 このビットの列による表現は、 2進符号binary code )と呼ばれます。

なお、ビットはデータの単位としては小さすぎて扱いにくいですので、通常のシステムでは、バイトをデータの単位とします。 バイトbyte )とは、8ビットのまとまりのことです。

2.1.2 2進数

コンピュータの扱うデータの中では、数値、特に整数が重要です。 ここでは、整数の2進符号について説明します。

例えば、整数のつもりで 123 と書きますと、これは 1 × 100 + 2 × 10 + 3 × 1 という値を持ちます。 100の位の数字が100の重さを持ち、10の位の数字が10の重さを持ち、1の位の数字が1の重さを持つのです。 このように、数字の位置に応じて重さを変える、数値の表記法を、 位取りpositional notation )と呼びます。 そして、重さが10倍10倍であることを、この位取りの 基数radix )は10であると言います。

基数10の位取りによって表現された数を 10進数decimal number )と呼びます。 基数2の場合は 2進数binary number )、基数8の場合は 8進数octal number )、基数16の場合は 16進数hexadecimal number )です。

10進数は、0から9までの10種類の数字を使って表現されます。 それに対して、2進数は0と1の2種類です。 2進数では、右から1の位、2の位、4の位、8の位、…となります。

普通のシステムでは、整数の2進符号として2進数を用います。 つまり 、0と1による位取りをビットの列に対応させます。 桁数が足りなければ、左側に0を追加します。 10進数と2進数、2進符号の対応は次の通りです。

表 2.1  10進数、2進数、2進符号の対応
10進数 2進数 2進符号(1バイト)
0 0 0000 0000
1 1 0000 0001
2 10 0000 0010
3 11 0000 0011
4 100 0000 0100

8進数は、数字0から7までを使って表現されます。 16進数は、数字0から9までと、英字AからFまでを使って表現されます。 英字については、A は 10, B は 11, C は 12, D は 13, E は 14, F は 15 です。

なお、このような文脈で単に20と書きますと、これが10進数なのか8進数なのか16進数なのか分からなくなります。 この混乱を避けるため、8進数を表すときは左側に0を追加する慣習があります。 この慣習に従いますと、020は10進数で16になります。 16進数の場合は、左側に0xを追加します。 すると、0x20は10進数で32になります。

ここで、10進数、2進数、および16進数を相互に変換する方法について説明します。 10進2進の相互変換と2進16進の相互変換ができれば、すべての変換ができます。

2進数を16進数に変換するには、次のようにします。

  1. 与えられた2進数の桁数が4の倍数になるように、左側に0を追加します。
  2. 2進数を4桁ごとに区切ります。
  3. 次の表に従って、2進数を16進数に置き換えます。
表 2.2  2進数と16進数の対応
2進数 16進数
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 8
1001 9
1010 A
1011 B
1100 C
1101 D
1110 E
1111 F

16進数を2進数に変換するには、表の逆方向に置き換えます。

10進を2進数に変換するには、次のようにします。

  1. 与えられた10進数を2で割り、商と余りを求めます。
  2. 商が0になるまで、直前の商を2で割り続け、商と余りを求めます。
  3. 余りの列を、下が左、上が右になるように並べ替えます。

例題1. 10進数 58 を1バイトの16進数に変換してください。 始めに手計算で変換し、次にプログラムEx2.javaを変更してjavacコマンドを実行し、バイナリ・ファイルEx2.classの内容を確認します。

解答例1. 10進数を2進数に変換してから16進数に変換します。

58 ÷ 2 = 29 … 0
29 ÷ 2 = 14 … 1
14 ÷ 2 = 7 … 0
7 ÷ 2 = 3 … 1
3 ÷ 2 = 1 … 1
1 ÷ 2 = 0 … 1

2進数 111010 を1バイトにすると 00111010 となり、これは16進数で 0x3a です。 したがって、10進数 58 は16進数で 0x3a です。

2進10進変換binary-to-decimal conversion

2進数を10進数に変換するには、次のようにします。

  1. 0の2倍と与えられた2進数の左端の数の和を求めます。
  2. 2進数の右端になるまで、直前の和の2倍と2進数の一つ右の数の和を求めます。
  3. 最後の和が変換結果です。

例題2. 16進数 0x28 を10進数に変換してください。 始めに手計算で変換し、次にバイナリ・ファイルEx2.classを変更してjavaコマンドを実行し、出力を確認します。

解答例2. 16進数を2進数に変換してから10進数に変換します。 16進数 0x28 は2進数で 0010 1000, すなわち 101000 です。

0 × 2 + 1 = 1
1 × 2 + 0 = 2
2 × 2 + 1 = 5
5 × 2 + 0 = 10
10 × 2 + 0 = 20
20 × 2 + 0 = 40

したがって、16進数 0x28 は10進数で 40 です。

2.1.3 2進数の四則演算

2進数の四則演算は、10進数の場合と同様に行います。 ただし、繰り上げと繰り下げには注意が必要です。 例えば足し算ならば、10進数の場合は10以上で繰り上げましたが、2進数の場合は2以上で繰り上げます。

例題3. 10進数の足し算 50 + 29 = 79 を2進数で行ってください。 始めに 50 と 29 を2進数に変換し、2進数の足し算を行った後、結果を10進数に変換します。

解答例3.

50 ÷ 2 = 25 … 0
25 ÷ 2 = 12 … 1
12 ÷ 2 = 6 … 0
6 ÷ 2 = 3 … 0
3 ÷ 2 = 1 … 1
1 ÷ 2 = 0 … 1

10進数 50 は2進数で 110010 です。

29 ÷ 2 = 14 … 1
14 ÷ 2 = 7 … 0
7 ÷ 2 = 3 … 1
3 ÷ 2 = 1 … 1
1 ÷ 2 = 0 … 1

10進数 29 は2進数で 11101 です。

    11 0010
+    1 1101
-----------
   100 1111

和は2進数で 1001111 です。

0 × 2 + 1 = 1
1 × 2 + 0 = 2
2 × 2 + 0 = 4
4 × 2 + 1 = 9
9 × 2 + 1 = 19
19 × 2 + 1 = 39
39 × 2 + 1 = 79

2進数 1001111 は10進数で 79 です。

2.1.4 負数の表現

10進数では、負数は -3 のように符号(-)と絶対値(3)を組み合わせて表現します。 2進数で負数を表現する方法には、絶対値表現と補数表現があります。 絶対値表現sign and magnitude notation )は、符号ビットと負数の絶対値を組み合わせるものです。 補数表現complement notation )には、1の補数と2の補数があります。 1の補数1's complement )とは、絶対値の2進数(1バイトならば左に0を追加して8桁にする)のすべてのビットを反転させたものです。 2の補数2's complement )とは、1の補数に1を足したものです。 通常のシステムでは2の補数が使われます。

例題4. 10進数 -20 を1バイトの16進数に変換してください。 負数の表現は2の補数を用います。 始めに手計算で変換し、次にプログラムEx2.javaを変更してjavacコマンドを実行し、バイナリ・ファイルEx2.classの内容を確認します。

解答例4.

10進数 -20 の絶対値 20 を2進数に変換します。

20 ÷ 2 = 10 … 0
10 ÷ 2 = 5 … 0
5 ÷ 2 = 2 … 1
2 ÷ 2 = 1 … 0
1 ÷ 2 = 0 … 1

2進数 10100 を1バイトにすると 0001 0100 です。

0001 0100
1110 1011(1の補数)
1110 1100(2の補数)

したがって、10進数 -20 は16進数で 0xec です。

2の補数の利点は、整数の符号を気にせずに四則演算が行えることです。 1バイトの足し算なら、8桁を越える部分を無視すれば、負数でも正しく計算ができます。 なお、計算結果の桁数が越えることを オーバーフローoverflow )と言います。

例題5. 10進数の足し算 49 + -11 = 38 を2進数で行ってください。 負数の表現は2の補数を用います。 始めに 49 と -11 を1バイトの2進数に変換し、2進数の足し算を行った後、和を10進数に変換します。

解答例5.

49 ÷ 2 = 24 … 1
24 ÷ 2 = 12 … 0
12 ÷ 2 = 6 … 0
6 ÷ 2 = 3 … 0
3 ÷ 2 = 1 … 1
1 ÷ 2 = 0 … 1

10進数 49 は2進数で 110001 です。

11 ÷ 2 = 5 … 1
5 ÷ 2 = 2 … 1
2 ÷ 2 = 1 … 0
1 ÷ 2 = 0 … 1
0000 1011(1バイト)
1111 0100(1の補数)
1111 0101(2の補数)

10進数 -11 は2進数で 11110101 です。

    11 0001
+ 1111 0101
-----------
1 0010 0110

和の、右から9桁目以上を取り除いた2進数 100110 を、10進数に変換します。

0 × 2 + 1 = 1
1 × 2 + 0 = 2
2 × 2 + 0 = 4
4 × 2 + 1 = 9
9 × 2 + 1 = 19
19 × 2 + 0 = 38

2進数 100110 は10進数で 38 です。


2.2 演習2

問1. 10進数 77 を1バイトの16進数に変換してください。 始めに手計算で変換し、次にプログラムEx2.javaを変更してjavacコマンドを実行し、バイナリ・ファイルEx2.classの内容を確認します。

問2. 16進数 0x5b を10進数に変換してください。 始めに手計算で変換し、次にバイナリ・ファイルEx2.classを変更してjavaコマンドを実行し、出力を確認します。

問3. 10進数の足し算 54 + 22 = 76 を2進数で行ってください。 始めに 54 と 22 を2進数に変換し、2進数の足し算を行った後、結果を10進数に変換します。

問4. 10進数 -35 を1バイトの16進数に変換してください。 負数の表現は2の補数を用います。 始めに手計算で変換し、次にプログラムEx2.javaを変更してjavacコマンドを実行し、バイナリ・ファイルEx2.classの内容を確認します。

問5. 10進数の足し算 43 + -17 = 26 を2進数で行ってください。 負数の表現は2の補数を用います。 始めに 43 と -17 を1バイトの2進数に変換し、2進数の足し算を行った後、和を10進数に変換します。


2.3 レポート課題

今日の演習2の答案をkonishi@twcu.ac.jpあてにメールで送ってください。 メールには、学生番号、氏名、科目名、授業日(10月1日)を明記してください。


2.4 参考文献


[小西ホームページ]   [目次・索引]   [前の授業]   [次の授業]

2004年10月4日更新
konishi@twcu.ac.jp
Copyright (C) 2004 Zenjiro Konishi. All rights reserved.