9.2. 二進法#

9.2.1. 10進数と2進数#

10進数

2進数

0

0

1

1

2

10

3

11

4

100

5

101

6

110

7

111

8

1000

9

1001

1234=10×103+2×102+3×101+4×100
10112=1×23+0×22+1×21+1×20=11
1001012=1×25+0×24+0×23+1×22+0×21+1×20=37

アルゴリズム

  1. 与えられた値を2で割った商と余りを求める。

  2. 商が0になるまで繰り返す。

  3. 商が0になったら、余りを逆順に並べる。

9.2.1.1. Example: 101101の10進数を求める#

1011012=1×25+0×24+1×23+1×22+0×21+1×20=45

9.2.1.2. Example: 13の2進数を求める#

  1. 13を2で割ると、商6、余り1

  2. 6を2で割ると、商3、余り0

  3. 3を2で割ると、商1、余り1

  4. 1を2で割ると、商0、余り1

  5. 商が0になったので、余りを逆順に並べる。

  6. 13の2進数は1101である。

9.2.2. 2進加算#

58+2785
111010+110111010101

9.2.3. 2の補数記法#

2の補数(two’s complement)記法は、コンピュータで整数を表現する最も一般的な体系である。

長さ3のパターン

ビットパターン

表現する値

011

3

010

2

001

1

000

0

111

-1

110

-2

101

-3

100

-4

  • 最左端のビットが符号を表す。符号ビットと呼ぶ。

  • 絶対値が同じである正負の値を表現するビットパターンの間に簡潔な関係がある。

    • 右から読んでいくと、最初の1が現れるまでのビットが同一である。

    • その1から右のビットは、お互いに補な関係がある。

9.2.3.1. Example: 1010を解読する#

  1. 1010の符号ビットは1なので、負の数である。

  2. 1010を正の数に変換すると、0110である。

  3. 0110の値は6である。

  4. 1010は-6を表す。

9.2.3.2. 2の補数記法による加算#

  • 2の補数記法による加算は、解も含めて全てのビットパターンが同じ長さである。

  • 2の補数記法による加算は、通常の加算と同じように行い、左端に生成される余分なビットを切り捨てる。

9.2.3.2.1. Example: 0101 + 0010#

0101+00100111

9.2.3.2.2. Example: 0111 + 1011#

0111+10110010

0111 + 1011 = 10010 であるが、最左端のビットを切り捨てる。

01112=710
10112=510
00102=210

9.2.3.3. 2の補数記法による減算#

75=7+(5)=2
  1. 7の2の補数を求める。7=01112

  2. 5の2の補数を求める。5=01012

  3. 5=10112

  4. 01112+10112=00102

9.2.3.4. オーバーフロー#

9.2.3.4.1. やってみよう#

#include <stdio.h>

int main() {
    char a = 127;
    char b = 1;
    char c = a + b;
    printf("a = %d, b = %d\n", a, b);
    printf("a + b = %d\n", c);
    return 0;
}

char型は8ビットで表現され、最大値は127であり、最小値は-128である。問題127+1 の結果は、char型の範囲を超え、128が得られないことになる。このような現象をオーバーフローと呼ぶ。

9.2.3.4.2. 2038年問題#

2038年問題

9.2.3.5. 16進記法#

ビットパターン

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進記法では、4ビットのパターンを1つの記号で表現できる。

9.2.3.5.1. Example: 2進数を16進数に変換する#

10112=B16
1011 0101 00112=B5316

9.2.4. 小数#

9.2.4.1. 浮動小数点記法#

  • 符号ビット

  • 指数部

  • 仮数部

9.2.5. 練習問題#

  1. 次のビットパターンを16進記法で表現せよ。

    • 0101 1010

    • 1100 0011 1010

    • 1111 0001 0100 1001

  2. 次の16進数をビットパターンで表現せよ。

    • 610A

    • ABCD

    • 5F3A

    • 0100

  3. p=1,q=0 のとき、次の論理式の値を求めよ。

    • pq

    • pq

    • ¬p

  4. 次の10進数を2進数に変換せよ。

    1. 32

    2. 64

    3. 15

    4. 27

  5. 次の2進数を10進数に変換せよ。

    1. 101010

    2. 100011

    3. 0110

    4. 11111

  6. 次の2進数の和を求めよ。

    1. 101 + 110

    2. 1101 + 1011

    3. 10101 + 11011

    4. 101010 + 11011

9.2.5.1. 2の補数#

  1. 次の2の補数表現を、それぞれ等しい10進数に変換せよ。

    1. 00011

    2. 01111

    3. 11100

    4. 11010

    5. 00000

    6. 10000

  2. 次の10進数をそれぞれ等しい8ビットパターンの2の補数表現に変換せよ。

    1. 6

    2. -6

    3. -17

    4. 13

    5. -1

    6. 0