2・8・16進法の計算

 私たちが日常使う数は10進法で書かれていますが,コンピュータ内部での数の表現は2進法で行われています。しかし,コンピュータ内部で2進法で計算が行われていても,その結果は普通は10進法に変換されて画面やプリンタに出力されますから,一般のユーザーはこのことを気にする必要は余りありません。しかし,2進法はコンピュータの核となっている表現ですから,その反映 が色々場面で表れることあります。ですから,コンピュータについてある程度詳しく知ろうと思う人にとって,2進法の仕組みやその計算についての理解は必須のものと言えます。ですから,

コンピュータを良く知るためには,ある程度2進法について知ることは基本

と言えるでしょう。

 ここでは2進法とその略記法である8進法,16進法について説明します。

2進法とコンピュータ

 2進法の起源は意外と古く,ライプニッツ(1646~1716)まで遡ると言われています。しかし,手回しコンピュータや,電気式による初期のコンピュータでは2進法が使われていたわけではありません。コンピュータに2進法が取り入れられたのは,Atnasoff と Berry によるABC(Atanasoff-Berry Computer)(1940年頃)が最初と言われています。このコンピュータは電子式デジタルコンピュータの最初のものともされています。

 2進法が現在のコンピュータで使われる理由は,主に電子技術的側面にあります。2進法では1桁が0と1しかなく加減乗除等計算が非常に単純に行われます。(但し,その分だけ計算回数は多くなります。)この単純さがコンピュータのハードを構成する時の利点となりました。つまり

コンピュータで2進法が使われる理由は装置の作りやすさから

と言えます。便宜的な感じもしますが,

私たちが10進法を使う元々の理由は手の指が10本だから

ということを考え合わせると,進法の選択は元々便宜的なものなのかもしれません。

2進法の原理

 2進法は数についての次の性質から得られます。

命題  0でない自然数aは

a=a+・・・+a2+a,  但し ,a≠0でaは0または1

と唯一通りに表される。

 この性質から,数aを表すのに,この表示を常に対応させることにして,aのことを

m-1・・・a

と表すことにします。これをaの2進法表示といいます。実は10進法や,一般にn進法といわれるものは同様に定められるものです。

 例えば,普通の10進法での43は

43=1・2+0・2+1・2+0・2+1・2+1

ですから,2進法では101011と表されます。これを

101011(2進)=43(10進)

のように表すことにします。

2進法での加減乗除

 2進法での加減乗除は10進法でふつうに行うのと同様に出来ます。例をあげましょう。

加法

   
 

 

減法

 
-  

   

乗法

     
×    

     
     
     


除法

         

1 1
      - 1    
         
        -  
           
          -

             

 このように,2進法でも普通の計算と同様に行われますが,10進法の場合と重要な違いがあります。それは,各桁が1と0しかないため計算回数が多くなるという欠点はありますが,

各段階での計算は全く簡単です!!

10進法の計算で苦労した九九を使うことや,割り算で幾つが立つか考えることがありません。特に1桁だけについて考えれば

1+1=10, 0+1=1

1×1=1,  1×0=0

と言ったものだけです。このように単純化できたことで,この計算を実行する電子回路を実際に作ることが出来るようになりました。(それでも,この計算をする回路は単純というわけではありません。)

2進法での分数

 コンピュータで扱われる数は整数だけではありません。日常の計算でも分数や小数を扱います。コンピュータでは分数は割り算を行うことと解釈して,分数のみを実際には扱います。(勿論,数式処理ソフトのような特別なものでは,分数をそのまま扱います。)

2進法での小数の意味は次のように定められます。

a=a+・・・+a2+a+b1-1+・・・+ b-n

(但し,a≠0でaとbは0または1)と表される 数aを

m-1・・・a.b・・・b

と表して,aの2進小数表示と言います。

 コンピュータで小数を扱う場合,当然のことですが,扱う小数は有限小数です。しかし,割り算を行った場合,結果が無限小数になることがしばしばあります。この場合コンピュータでは,適当な有限部分で切って,次の桁を四捨五入(2進の場合は零捨一入?)して有限小数にします。従ってこの場合,計算誤差がここで混入することになります。

 10進法で1/3や1/7が無限小数になることは良く知られていますが,2進法で分数を表した場合,どのような数が無限小数になるのでしょうか。これについては次のことが示されます。

 2進小数で有限小数となる既約分数は(10進小数で表した場合)奇数aに対して,

a/2

の形の数に限られる。

こ の事実は,コンピュータに取って残念な結果です。実際,この形の数は数全体からすれば,極めて僅かな割合しかありません。実際の割り算の計算で,除数が2の冪であることは本当に少ないことです。つまり,割り算の計算では割り切られる場合を除けば,

殆んどが2進小数では無限小数になり,コンピュータでの計算では誤差の素になる

ということです。ですから割り算を伴った小数計算では必ず誤差の問題が生ずることに注意しましょう。勿論十分大きな桁数を取って計算をすれば,普通の計算では,実用上問題のない程度の誤差になることも事実です。

 数値計算では誤差の評価が重要な問題で,色々と研究されています。

8進数・16進数

 コンピュータ内部では2進法が使われていますが,2進法を扱う上で1つ欠点があります。それは数の大きさに比べて桁数がかなり大きくなることです。例えば,365を2進法で表すと,

101101101

となります。コンピュータで扱うのはこの程度の桁は何でもありませんが,人間が手計算で簡単に処理できる桁数は恐らく5桁程度ですから,かなりの負担です。このため2進数をもっと簡単に表記する方法が考えられました。それが,8進法や16進法です。つまり

8進法や16進法は2進法の略記法

です。(勿論,数学的には,8進法や16進法は2進法とは独立に定義することもできます。),


16進法

16進法は2進数を4桁づつ纏めて1桁と表したものです。

 

対応は次の表で与えられます。

2進法

16進法

0000

0001

0010

0011

0100

0101

0110

0111

2進法

16進法

1000

1001

1010

1011

1100

1101

1110

1111

例えば,

1001101011(2進法)=0010 0110 1011 (2進法)

                = 2    6    B  (16進法)

      = 26B(16進法)   

となります。

 現在のコンピュータは8ビットを基本単位として扱っています。ですから,この8ビットを2桁の16進数で表すのは便利で,16進法表記は良く使われます。


 8進法

 8進法は2進数を3桁づづ纏めて1桁としたものです。

対応は次の表で与えられます。

2進法

8進法

000

001

010

011

2進法

8進法

100

101

110

111

例えば,

1001101011(2進法)=001 001 101 011 (2進法)

              = 1  1  5   7  (8進法)

    = 1157(8進法)   

となります。

まとめ

 私たちは,10進の世界に住んでいますから,2進法(16進法)に慣れるのは中々大変です。ですから実際に16進法を使って計算する状況になった場合は適当なツールを使って計算するのが良いでしょう。実際,Windows に付属している電卓にも,関数電卓モードではそのような機能が備わっています。 Tiny Basic では,現在,16進についてはHex$ と&がありますが,十分とは言えません。機会を見て充実させることも考えますが,今は取りあえず,

10進,2進,8進,16進変換のプログラム

を作ってみました。小数にも対応しています。Bin.tbt です。ツールとしてダイレクトモードで使うのが便利です。 お試し下さい。