二進数

大抵の計算機は電子回路で作られていて, 内部は 0/1 の値をとる論理回路の組合せである.

0/1 の値をとる素子一つを 1ビット (bit - binary digit) という. その素子を8個ならべると, 1バイト(= 8ビット)の記憶素子となるが, それが覚えておける値の種類はどれだけあるかというと

2 × 2 × 2 × 2 × 2 × 2 × 2 × 2 = 256 通り
である. 一般に n ビットのメモリがあれば, 2のn乗とおりの値が記憶できる.

問題はこの 256通りのパターンに, 数値をどのように対応させるかである. たとえばこんな方法がある:

00000000 -> 0
00000001 -> 1
00000010 -> 2
00000011 -> 3
00000100 -> 4
...
これが数値の二進法による表現である. どんどん続けると
...
11111101 -> 253
11111110 -> 254
11111111 -> 255
というぐあいに, 255まで表現できる. もちろんこの 255 という数値は
(2 の 8 乗) - 1
である.

ところで, この方法では負の数が表現できない. そのために, 以下のような対応を使う:

00000000 -> 0
00000001 -> 1
00000010 -> 2
00000011 -> 3
00000100 -> 4
...
01111110 -> 126
01111111 -> 127 (ここまではさっきと同じ)
10000000 -> -128 (ここで突然マイナスになる!)
10000001 -> -127
...
11111101 -> -3
11111110 -> -2
11111111 -> -1
これを, 「2の補数表現」と呼んでいる. 普通に計算機の上で使っているのはこの表現である.

2の補数表現についての質問 - 考えてみよう.

  1. 一番左のビット(最上位ビット, MSB - Most Significant Bit) が 1 である 数に共通する性質は何だろう?
  2. 一番右のビット(最下位ビット, LSB - Least Significant Bit) が 1 である 数に共通する性質は何だろう?
  3. 正数 n の2の補数表現から, (-n) の2の補数表現をつくるには, どうすればいいだろう?
  4. ある数を 1 ビット左にずらして右端に 0 をいれると, どんな数が得られるだろう?
  5. ある数を 1 ビット右にずらして左端に 0 をいれると, どんな数が得られるだろう?
  6. ある数を 1 ビット右にずらして左端には元の左端と同じものをいれると, どんな数が得られるだろう?
  7. ある数の右端の 2 ビットを全部 0 にしてしまうと, どんな数が得られるだろう?
  8. ある数の右端の 2 ビット以外を全部 0 にしてしまうと, どんな数が得られるだろう?
  9. ある数の2の補数表現における, 「1となっているビットの個数」には何か意味があるだろうか?

こうして -128 から 127 までの整数はあらわせたとして, それより 大きい数をあらわすにはどうするか.
8 ビットよりももっとたくさんのビットを使えばよいわけだ. たとえば, 16 ビット使うことにすると,

-32768 から 32767 まで
があらわせるし, 32 ビットつかうことにすれば
-2147483648 から 2147483647 まで
あらわせる. (それでも, たったの 20億ちょっとだ. 国家予算とかは もっとビット数が必要なのだなあ)

さらに, こうして整数は表現できたとして, では小数はどうするのだろう? (また後日)


prev index next