整数の表現と計算


  1. 整数の表現

    1. 正の整数(10進数)

       1桁の10進数では 0〜9 までの数値しか表現できません。10以上の数字は二桁の数字を利用して
            10*M+N 
      の数を M N と数を並べて表記します。3桁の数は L M N と表記し、
            10*10*L + 10*M + N
      を意味します。10進数は 9 まで進むと 0 に戻り上位の桁の数を1つ増すことになります。左の桁は右の桁の10倍の値になります。

      例 352 = 3*102 + 5*101 + 2*100 = 3*100 + 5*10 + 2
    2. 2進数による計数

       計算機では 0,1 の2種類の記号しか利用できません。0の次の数は1です。1の次の数は 0 を1に戻し、次の桁の数を1増やし 10 と表記します。10 の次の数は 11 です。11 の次の数は 100 です。これは10進数で 99 の次の数は100 になるのと同じです。
       二桁の2進数字 M N で 2*M + N の数を表すことができます。3桁の L M N では 2*2*L + 2*M + N を表します。3桁の2進数で、10進数の0〜7までを表現できます。以下に4桁の10進、2進、16進数の表現をまとめます。16進数は4ビットまでの数を16種の記号を用いて1つの記号で表現します。
      10進数 0 1 2 3 4 5 6 7
      2進 0000 0001 0010 0011 0100 0101 0110 0111
      16進 0 1 2 3 4 5 6 7
      10進数 8 9 10 11 12 12 14 15
      2進 1000 1001 1010 1011 1100 1101 1110 1111
      16進 8 9 A B C D E F
      一般に、m桁のN進数は次のように数を表記します。
       使用する記号 0,1,...,N-1
       表記法:        Am-1 ..  A1A0
       意味する数:  Am-1Nm-1 + ... + A1N1 + A0N0
      また、2のべき乗に関する10進数と2進数を覚えておくと便利です。
      n  1  2  3  4  5 6 7 8 9 10 11 12 13 14 15 16
      2nの10進 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536
      210 は 1024 ですから 1000 に近い値になります。 210 を 1000 (1k:キロ)に近似して、 214 を 16k、 216 を 64k と呼ぶことがあります。 220 は1M(メガ)、 230 は1G(キガ) に近似されます。232 は4G になり、これが32ビットの限界になります。8ビットでは255、16ビットでは65535 が表現できる正の整数の限界になります。

      演習1
       4桁の範囲(000から1111まで)で2進数を順に列挙ください。
       指を折り曲げて2進数で数を数える場合、両手でいくつまで数えることができますか?
       3ケタの範囲で、3進数を15個、順に列挙してください。(0>1>2>10>11>..)
    3. 2進数と10進数の変換

       2進数が与えられたとき、対応する2進数に変換するには、n桁目の1に2n-1 を乗算してから加えます。
      例えば、0101 1001 の場合、1,4,5,7 桁目が1ですから、
        20 + 23 + 24 + 26 = 1 + 8 + 16 + 64 = 89
      となります。
       逆に、10進数 m を2進数に変換するには、m を0になるまで2で割ります。このときの余りを逆順にならべたものが2進数になります。89の場合、
           89 / 2 = 44(1) 、44/2=22(0) 、22/2=11(0)、
         11/2=5(1)、5/2=2(1)、2/2=1(0)、1/2=0(1)
      ですから、101 1001 となります。()の中は余りです。以下のように計算することも出来ます。一番右の列が余りです。
          2|89
          2|44  1
          2|22  0
          2|11  0
          2| 5  1
          2| 2  1
          2| 1  0
          2| 0  1

      小さな数の場合
       15以下の小さな数では、8,4,2,1 のグループに分解します。例えば、9は8と1に分解できますから、 1001 となります。一般には変換したい数(d)より小さい最大の2のべき乗の数(2n)を求めます。これで2進数の桁数が求まります。d より 2n を引きます。残りの数にどうようの計算をします。

      38 の場合、まず、25 =32 より n=5 が決定します。次に 38-32=6 についてどうようの処理をします。n=2 になります。これを繰り返して、100101 が求められます。

      演習2
      次の10進数を2進数に変換してください
        6、12、25、52、100
      変換した2進数を、10進数に戻して結果を確認してください。

    4. C言語と16、8進数

       C言語では16進定数を 0xE38F のように先頭に0xをつけて表記します。また8進数は先頭に 0 をつけて 0357 と表記します(int x=012 とすると、10進数12でなく8進数の12になります)。表示する場合、printf の書式で、16進数は %x 、8進数は %o を利用します。

  2. 2進演算

    1. 1桁の2進数の足し算

       2進数は0と1しかありませんから、足し算は簡単です。
       0 + 0 = 0
       0 + 1 = 1
       1 + 0 = 1
       1 + 1 = 1 0
      問題は、1 + 1 の場合です。2進数1桁では結果が収まりません。したがって、2桁で結果を書きます。二桁目の1は、10進数で 6+7 = 13 となる場合と同じで、二桁目の1は次の桁への「桁上がり」になります。
    2. 一般2進数の足し算

      2進数の足し算方法は10進数の足し算の方法と変わりません。下の桁から桁上がりを考慮して順に計算します。2進数で和が(10進で)2以上の場合は、2を引き、1を次の桁へ桁上げします。
        0 0 1 0
       + 0 1 1 0
      ------------
        1 0 0 0

      この計算は、10進数では、2 + 6 = 8 に相当します。
    3. 2進電卓

      Windowsのアクセサリの電卓で2進と16進数の計算ができます。「表示」を関数電卓にします。すると、計算する数字を16進、10進、8進、2進、に切り替えることができます。大きな数の2進計算には便利です。
    4. 正の整数の乗算、除算

       乗算のA + B は、A、B が正の整数であれば A を B回 加えれば計算できます。しかし、この方法では計算が遅いので、次のように組み立て算で計算します。10進数の場合と同じですね。
          00101
          00011
      ----------
          00101
         00101
        00000
       00000
      ----------
       00001111
      上位の桁は下位の桁の2倍になりますから1桁ずらしながら、足していくことになります。乗数(B)が負の場合、A,B の符号を共に補数をとれば、乗数を正の数にできます。除算の場合も同様です。
    5. 演習問題

      次の計算をしてください
        01101 + 00101 =
       01001 + 01111 =
       00101 * 01010 =

      検算 結果を10進数で検算して確認しましょう。1/4くらいの人が試験で計算ミスしています。

    6. C言語の整数計算

       C言語では整数を int 型 で表し、演算を +,-,*,/ で表現します。int 型変数は32bitマシンでは 32bit(4バイト)で、64bitマシンでは64bitです。変数のバイト数は seizeof() 関数で知ることができます。
       int i,j;
       i = 2;j = 3 + i * 5;printf("%d:\n",sizeof(j),j);
      結果
        4:13
    7. シフト演算と2倍

      2進数の右のシフトとは、2進数の各桁を右に移動し1桁目を0にすることです。たとえば、0011は1ビット左シフトすると、0110 になります。C言語では 左シフト演算を 変数 << 桁数 であらわします。
      例 j を2ビット左シフトし、その値を表示します。
       int j=13;int k = j<<2 ;printf("%d:%d\n",j,k);
      結果
       13:52
  3. 固定小数の表現(参考)

    1. 小数の表現

       10進数で 12.34 は 1*10 + 2 + 3 * (1/10) + 4 * (1/100) を意味します。小数点以下は10のマイナスのべき乗になります。2進数の少数も同様に表現されます。たとえば、10.01 の場合、
       21 + 2-2
      となり、10進数では 2 + (1/4) となります。小数を計算する場合、小数点の位置を合わせて計算する必要があります。また、小数点をどのように表現するかも問題です。
    2. 固定小数点表現

       小数点の位置を固定して表現します。例えば、8ビットの2進数で左4ビットと右4ビットの間に小数点があるものとします。すると、 0001 1000 は 10進数で 1.5 となります。このような表現を固定小数点表現といいます。固定小数点の加減算は整数の場合と同じです。小数点以下の10進数を2進数に変換するには、少数を2倍をしていき、1.0を超えたらそれを削除し、対応する2進数の桁を1とします。0.625 の場合
           0.625 * 2 =( 1).250  0.250 * 2 = 0.5000  0.500*2 = (1).0000
      ですから((1)は1をこえたので、削除する)、0.1010 となります。5.625 の場合、0101 1010 となります。
    3. 有限小数(参考)

       10進数で 1/3 は0.3333 となり、有限の小数では表現できません。小数点以下有限な桁の数で表現できる数を一般に有限小数といいます。有限小数でない数を表現すると、誤差が発生します。例えば、2進数で0.001(10進では 1/8)は有限小数ではありませんから、これを10000倍しても正確な100にはなりません。Cプログラムの単精度(32ビット)で0.001 をn回加えた結果を示します。
      100 100 1000 10000
      0.100000 0.999991 10.000411 99.956696
      この誤差には、2進数を10進数に変換するときの誤差も入っています。同じ計算を倍精度で行うとこの誤差は表示桁数(小数点以下6桁)の範囲では見えなくなります。
      100 100 1000 10000
      0.100000 1.000000 10.000000 100.000000
  4. 2進化10進数

    1. BCDコード

       10進数の各桁を2進数で表現する方式です。10進数1桁は2進数4桁で表現できますから、たとえば、
      2345 を 0010 0011 0100 0101 と表現します。この表現形式をBCD(Bynary Coded Decimal: 2進化10進数)といいます。BCD の場合演算は10進数とどうように行います。加算の場合、右から4桁単位で計算し、1010(10進数で10)を超えたら、1010を引き次の桁に1を加えます。
       この方法は、回路で計算をするのは複雑で、時間がかかります。しかし、10進数からBCDに変換する、あるいは逆に10進数に戻すのは簡単ですから、複雑な計算をしない 事務計算に利用される場合があります。
    2. ゾーン10進数

       多くの計算機は、8ビット(1バイト)単位でメモリにアクセスします。したがって、10進数の各桁を1バイトで表現するほうが効率的な場合があります。この場合、上位4ビットは適当な値で埋め、これをゾーンビットと呼ぶことがあります。ゾーンとしては 0011 の値がよく利用されます。最後の桁のゾーンビットの値を替えて符号を表現する場合があります。
  5. まとめ、デモ

    1. まとめ

      2進数で数える
      2進を10進に変換する、逆に10進を2進に変換する
      2進数での加算、乗算
      少数を2進表現する
      有限の桁では正確に表現できない数がある
    2. 2進計数(カウンタ)

      2進数で計数します。自動的に計数するタイプとスイッチを押すと計数するタイプがあります。この回路は組み込み用コンピュータを利用しています。メディアシステムI,IIで制作実習をしています。詳細はこちらをご覧下さい。デモ:組み込みコンピュータによる2進数表示
  6. 課題

    1. 演習

      ■以下の10進数を2進数に変換しなさい(計算過程を明記すること)
       137、85
      ■ 以下の計算をしなさい
       01101 + 00101 =
       01001 + 01111 =
       00101 * 01010 =
      ■ 以下の2進数を指定した数だけシフトした数を2進数と10進数で表記しなさい。
       1010 を左に2ビット
       1100 を右に2ビット
    2. レポート課題

      1:次の計算は何進法で成立するか。
      (基本情報処理 平成18年春問02)
         131 - 45 = 53
        1:6 2:7 3:8 4:9
      ヒント:進数を m とおくと、131は m*m+3*m+1 となります。mの方程式を導きます。

      2:正の整数の 10 進表示のけた数 D と 2 進表示のけた数 B との関係を表す式の
      うち,最も適切なものはどれか。(基本情報処理 平成19年春問02)
       1: D ≒ 2 log(10) B 2:D ≒ 10 log(2) B 3:D ≒ B log(2) 10 4: D ≒ B log(10) 2
      ヒント 10進数D桁であらわすことができる数の種類は 10D
    3. アンケート

       1:10進数 12 に対応する2進数はどれですか
         1:1001 2:1110  3:1100  4:1101

       2:0101+011 の値は
        1:0111 2:1001  3:0110  4:1000

       3:0101*0011 の値は
        1:1110 2:1111  3:1011  4:1100

       4:3.25 を少数つき2進数で表現すると
        1:11.10 2:10.01  3:11.01  4:11.11