第1章 数系(その1)
コンピュータ内部の演算には、(0と1)の2値からなる2進数が用いられています。
この2進数により、シンプルな回路構成ながら、きわめて信頼性の高い装置を実現することができます。
ところが、この2進数では桁数が多くなり、人間にとって実用的な方法とはいえません。
このため、人間とコンピュータとの接点で10進数をはじめとする他の数系と、2進数との間の変換が必要になります。
最後には、WWWのCGIという手段を用いた練習問題がありますので、解いてください。
目次
1.1  10進数と2進数
1.2  数系の変換
1.3  演習問題

1.1 10進数と2進数
 はじめに、2進数について整理しておきましょう。
最近は電卓に押され、存在感が薄くなってきてはいますが、ソロバンを1度ぐらいは目にしたことがあるでしょう。
 普通のソロバンの玉は上の段に1つ、下の段に4つあります。
下図は1つ玉のソロバンです。このようなものは実際には存在しませんが、2進数の説明のため用意しました。

 普通のソロバンでは、1の桁の左は10の桁、さらにその左は100の桁です。
しかし、2進のソロバンでは1の桁の左は2の桁、さらにその左は4の桁となります。
 この図では5桁しかありませんが、5桁目は 2=16に相当します。
 図をもう1度見てください。1桁目と3桁目が1(上)で、残りは0(下)となっています。
 したがって、この2進数 00101 は、
  0×2 0×2 1×2 0×2 1×2=4+1=5

となり、10進数の5を表すことになります。
2進と10進を区別する ために、
 00101(2)=5(10)
と書くことがあります。
図の玉の部分の上下をマウスでクリックしてみて下さい。玉の位置が変わると同時に、1と0が反転するはずです。
これに応じて、2進数と対応する10進数も表示されます。
5桁の2進数(ただし正)で、最も小さな数は何でしょうか?
答えは、
0×2 0×2 0×2 0×2 0×2=0
です。逆に最も大きな数は
1×2 1×2 1×2 1×2 1×2=16+8+4+2+1=2−1=31
となります。
2進数1桁のことを bit(ビット)と言います。
これはbinary digit の略で、「上図は5ビットのソロバンである」という表現を用います。
また、2進数の2、10進数の10のことを、基数(radix)と呼びます。
最も上位の桁を MSB (Most Significant Bit)、最も下位の桁を LSB (Least Significant Bit)と呼びます。
この略号はよく使用されますので、覚えてください。

コンピュータ内部の演算には、(0と1)の2値からなる2進数が用いられています。

 2進数で表せる数値の範囲は?

5ビットの2進数では、0から31までの数値が表せます。
それでは8ビットの場合、どうなりますか?
答えは
  00000000(2)=0(10)
  11111111(2)=255(10)
で、計256通りになります。
それでは16ビット(2バイト)の場合は、どうでしょうか?
答えは
  0000000000000000(2)=0(10)
  1111111111111111(2)=65535(10)
となり、計65536通りになります。
 それでは32ビット(4バイト)の場合は、どうですか?
  00000000・・(略)・・00000000(2)=0(10)
  11111111・・(略)・・11111111(2)=4294967296(10)
で、約43億通りになります。
 最近のごく普通のパソコンは32ビットマシンです。
特別な用途(大きな組織の予算管理等)を除けば、たいていの整数は32ビットで十分表せることがわかります。


1.2 数系の変換
コンピュータ内部の演算には、(0と1)の2値からなる2進数が用いられています。
本節では10進数と2進数、あるいは他の数系の変換手法について解説します。
前にも述べましたが、コンピュータや電卓では2進数による計算が行われています。
一方、2進数は10進数等に比べ、桁数が大きくなり人間にとって不便です。
このため、人間とコンピュータのインタフェース部で、10進数を2進数に変換したり、その逆の変換が必要になります。
なお、何進数でも計算結果に変わりはありません。
場合により、2進数との変換が容易な16進数や8進数が用いられることがあります。
本節では、その変換方法について学習します。

     図 数系の変換

 下に10進数と他の数系の関係を示します。

       表 10進数と他の数系

10進数 2進数 8進数 16進数
 15
14
13
12
11
10









1111
1110
1101
1100
1011
1010
1001
1000
0111
0110
0101
0100
0011
0010
0001
0000
17
16
15
14
13
12
11
10
07
06
05
04
03
02
01
00















ここで、例えば10進数の12に注目して下さい。
このとき、以下の関係があります。
  12(10) 1×101 2×100
      = 1×23 1×22 0×21 0×2
      =  1×81 4×80
      =   C×160
以下、これらの数系の変換を行う手順を示します。
なお、これらは、あくまで1つの方法にすぎません。
前節で述べた「べき」の等式が成立するよう、数値を求めてゆけば、何進数であれ簡単に計算できます。
(この方法にこだわる必要はありません。)。

1.2.1  10進−2進変換
一般的な手順を以下に示します。
[手順]
   (1) 10進整数を2で割り、商と余りを求める。
   (2) (1)の商をさらに2で割り、商と余りを求める。
   (3) 商が0になるまで(2)を繰り返す。
   (4) (商が0になった後)求めた余りを逆順に並べる。
[例題]
             余り
    2 ) 306 
    2 ) 153 … 0
    2 )  76 … 1
    2 )  38 … 0
    2 )  19 … 0      306(10)=100110010(2)
    2 )   9 … 1
    2 )   4 … 1
    2 )   2 … 0
    2 )   1 … 0
          0 … 1

1.2.2  2進−10進変換
定義から、以下の手順が導かれます。
[手順]
   (1) 2進整数のn桁目の値に重み2n-1をかける。
   (2) (1)の値をすべて加算する。
上の[例題]の逆
    100110010(2)  = 1×2+0×2+0×2+1×2+1×2 +0×2+0×2+1×21+0×2
                = 256+32+16+2=306(10)

変換の検算について

10進−2進変換の結果が正しいことを確かめるには、どのようにしますか?

この逆の変換である2進−10進を行い、元の値に戻ることを確認するのが一般的な方法です。


1.2.3  2進−8進変換
2進数を8進数に変換する方法として、一旦10進数に戻し、その結果を新たな基数8で割って求める方法があります。
しかし、以下の手順を使えば、直接結果を得ることができます。
[手順]
   (1) 2進整数を下位から3桁ずつ区切る。
         (必要に応じ上位の桁に0を追加)
   (2) 各区切りを10進(8進)数に変換する。
[例題]
      10 110 111(2) = 267(8)
       ↓  ↓   ↓
       2   6   7

1.2.4  2進−16進変換
2進−8進変換と同様に、直接16進数に変換する方法があります。
以下はその手順です。
[手順]
   (1) 2進整数を下位から4桁ずつ区切る。
         (必要に応じ上位の桁に0を追加)
   (2) 各区切りを16進数(0,1,2,3 … A,B,C,D,E,F)に変換する。
[例題]
       |1011 |0111(2) = B7(16)
         ↓    ↓
         B     7

10進−8進変換 や 8進−10進変換 はどうしますか?

(1) 「10進−2進」と「2進−8進」の組み合せ
    「8進−2進」と「2進−10進」の組み合せ

(2) 上の手順において

  2で割り → 8で割り
  重み2n-1 → 重み8n-1

とする方法があります。


1.2.5  小数の表現
今度は、小数1.375を2進数に変換してみましょう。
そもそも、上の小数は
   1.375=1×100+3×10-1+7×10-2+5×10-3
      =1×20+0×2-1+1×2-2+1×2-3
となります。したがって
   1.375(10)=1.011(2)
と変換できます。
小数部に基数2をかけると、1ビット左にシフトします。
すなわち、小数の1桁目は整数部の1桁目にシフトします。
これから、以下の手順が導かれます。
[手順]
   (0) 整数部と小数部に分ける。
  以下、その小数部について、

   (1) 基数2を掛け、整数部と小数部に分ける。
   (2) (1)の小数部に2を掛け、再度整数部と小数部に分ける。
   (3) 小数部が0になるまで(2)を繰り返す。
   (4) (2)の整数部を上位から並べる。
[例題]
      1.375=1+0.375

     小数部      整数部
    0.375×2=0.75 …  0
    0.75×2=1.5   …  1
    0.5×2=1.0    …  1

したがって
    0.375(10)= 0.011(2)
すなわち
    1.375(10)= 1.011(2)

1.3  演習問題
本章で説明した基数の変換を理解するには、実際に計算してみることが一番の近道です。
以下、それらの問題が8問示されます。

はじめに学籍番号と名前を正しく入力してから解答を始めて下さい。
入力文字の修正には、[ Back Space ]キーを用いてください。( [ ]キーは 使用しない こと。)

なお、与えられた問題をクリアしないと、次の問題に進めません。
解答が誤っている場合は、同じような問題が再度提示されます。
問題は乱数を用いて生成されるので、毎回内容が異なります。

それでは、開始して下さい。

問題へ進む。