« 肉・玉子・牛乳・豆腐・大豆・・・欲しくなくてもタンパク質をとる毎日♪&雨上がりプチラン | トップページ | 週1度はセキュリティ対策でスマホの電源オフ(NSA米国国家安全保障局)&浮気しまくりの後、元のジムに復帰♪ »

2進法の計算、直接的な減法(引き算)と、コンピューター内部で「2の補数」を用いる減算 ~ 高校『情報Ⅰ』

1年半ぶりに、高校の新必修科目『情報 I 』の教科書(東京書籍)で記事を書いてみよう。プログラミング記事は別にすると、今まで2本だけ記事をアップ。2本目には地味にアクセスが入り続けてる。相対的にきっちりしたデジタル計算の方が好まれるということか。あるいは、高校のテストに出やすいとか。

     

 アナログの音のデジタル化(標本化=サンプリング、量子化、符号化)~高校『情報Ⅰ』(新必修科目)

 デジタル画像の可逆圧縮、「ランレングス(連長)圧縮」の簡単な具体例と説明、圧縮率の計算~高校『情報Ⅰ』

    

今日ここで扱うのは、正直言うと、私が今までなるべくスルーしてた「2の補数」の話。2進数の引き算をコンピューターが行う時、直接の引き算ではなくて、まず引く数に対する「2の補数」を求めて、引かれる数に足して、最後に「桁上がり」を削除するらしい。

  

この話を最初に聞いたのはかなり前のことで、ずいぶん回りくどい方法だなと感じてしまった。引き算1回を、3回の演算に分けて処理することになる。今でも、面倒な手続きのデメリットに対してメリットがどれだけあるのか、人間の私としてはよく分からない。

   

とはいえ、高校の必修科目の教科書で、計算の基本として説明されてるので、試しに学校教育の流れに乗ってみよう。教科書p.38~p.39の内容。

   

   

    ☆   ☆   ☆

まずは、2進数の足し算の確認から。例題1①。下線の入力が出来ないので、代わりに色を変える。

   

ポイントはただ1つ。「1+1=10」。つまり、1と1を足す時だけ、1が上の位に繰り上がる。ちなみに、特に何も書かなければ2進数を表すことにする。

       

   0101

+) 1001

   1110

   

この計算は、右端(2の0乗の位)からその左隣(2の1乗の位)へと、繰り上がりが1回あるだけだから、非常に簡単。

   

  

    ☆   ☆   ☆

続いて、直接的な減法(引き算)。足し算は昔から普通にある話だが、引き算を前面に出すのは目新しいことのような気がする。

  

例題1②。ポイントはただ1つ。

0-1=1 ただし上の位(左の桁)から1、借りる」。

   

   1010 

-) 0110

   0100

   

答の最上位(左端)の0を書いてるのは、この後、全体の桁数や左端が重要な意味を持って来るから。例えば、左端の0は「正(+、プラス)」の意味にもなる。

   

もう1問、やってみよう。問題3②。教科書では、2の補数を用いて計算することになってるが、ここではまず普通に引き算してみる。

  

   1100 

-) 1001

   0011

   

この計算では、まず右端で、0-1=1となって、引かれる数の左隣の桁から1借りる。ところが左隣は0だから、そのまた左隣から借りて来て、結局、100-1=11、と計算することになる。

  

そうではなく、「0から1借りるから、右端から2番目はまず-1になる。さらに、-1-0=1で、上の桁から1借りて・・」などと考えることも可能だが、流石に不自然すぎて間違えやすいし、分かりにくいだろう。

   

    

    ☆   ☆   ☆

一方、コンピューターの内部では、引き算は、「2の補数」を用いて足し算にすると言われてる。具体的な問題でやってみよう。

  

まず、上の例題1②の引き算。1010-0110=0100

    

引く数0110に対して、「補数とは、ある自然数に足して桁が1つ上がる数のうち、最も小さな数のこと」。2進法だと、2の補数とも呼ばれる。

  

この説明は分かりにくいので、2進法の場合の簡単な説明も載ってた。「補数は2進法の数値の0と1を反転させた数に1を足すことで機械的に求められる」。「2の4乗-元の数」という数学的説明と比べても、反転+1の方が実用的だと思う。

   

上の問題の場合、(0110の補数)=1001+1=1010。要するに、10000-0110を表してる。(2の5乗)-(元の式の引く数)。

    

これを用いると、元の引き算は次のように処理できる。ある数を引く代わりに、その数の補数を足して、10000を引く(4桁の引き算の場合)。

   

 1010-0110

=1010+(10000-0110)-10000

=1010+(2の補数)-10000

=1010+1010-10000

0100

  

確かに、直接の引き算と同じ答が出た。

   

    

    ☆   ☆   ☆

続いて、問題3②も補数で計算し直してみる。

   

 1100-1001

=1100+(10000-1001)-10000

=1100+(2の補数)-10000

=1100+0111-10000

0011

 

これも同じ答になった。

   

    

     ☆   ☆   ☆

では最後に、答がマイナスになる引き算について。教科書には載ってなかったので、手元のデジタル関連本の問題を少し改変して考えてみよう。1010-1101。

   

直接の引き算だと、最初に少し変形して、引きやすくする。負の数が登場する中学1年くらいで使ってた変形だと思う。

    

  1010-1101

= -(1101-1010)

= -0011

   

マイナスの符号を除くと、元の引く数1101の補数になってるが、これは単なる偶然。ちなみに、上の計算を十進数で書き直すと、10-13=-3ということ。

     

一方、2の補数を用いて引き算すると、

  1010-1101

= 1010+(10000-1101)-10000

= 1010+(2の補数)-10000

= 1010+0011-10000

= 1101-10000

= -(10000-1101)

= -0011

   

答は一致するが、やはり人間的にはメリットを感じないどころか、短所・欠点の方が目立つ気もする。

   

   

     ☆   ☆   ☆

案外、コンピューターの設計図である論理回路を2種類、書いて比較すれば、2の補数を用いた引き算の長所が見えて来るのかも知れない。

    

それは図の作成も含めてかなり面倒な作業になってしまうから、先送りにしとこう。とりあえず、今日の所はこの辺で。。☆彡

         

    (計 2356字)

| |

« 肉・玉子・牛乳・豆腐・大豆・・・欲しくなくてもタンパク質をとる毎日♪&雨上がりプチラン | トップページ | 週1度はセキュリティ対策でスマホの電源オフ(NSA米国国家安全保障局)&浮気しまくりの後、元のジムに復帰♪ »

数学」カテゴリの記事

教育」カテゴリの記事

情報」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« 肉・玉子・牛乳・豆腐・大豆・・・欲しくなくてもタンパク質をとる毎日♪&雨上がりプチラン | トップページ | 週1度はセキュリティ対策でスマホの電源オフ(NSA米国国家安全保障局)&浮気しまくりの後、元のジムに復帰♪ »