MAGAZINE

キャリテク!マガジン

コラム

シフト演算はコンピュータの基本的な演算

こんにちは。小澤です。

基本情報技術者試験に向けた学習は進んでいますか?
毎日少しずつでも学習に取り組むことで、自分の理解度を確認しながら進めることができます。コツコツと進めていきましょう。

さて、今回は、算術演算について理解を深めることにします。
徹底攻略 基本情報技術者試験教科書 令和5年度』では、「1−4 算術演算」(40ページ〜43ページ)の内容です。

算術演算は、数値に対して行われる演算であり、加算・減算・乗算・除算などがその例です。

しかし、コンピュータの世界での算術演算は一般的なものとは少し異なり、シフト演算という処理で行われます。

シフト演算を含めた算術演算は、プログラムの作成やデータ処理をよりスムーズに行うために重要なスキルです。

基本情報技術者試験では、全体を通じて知識が問われる問題が多いですが、算術演算は計算することで確実に得点できる問題です。

シフト演算は普段使うものではないので、少し戸惑うところもあるかもしれませんが、ぜひマスターしましょう。

コンピュータが持つ演算機能は加算のみ

算術演算とは、通常2つの数値を足したり引いたりする処理を指しますが、コンピュータが持つ演算機能は実際には加算のみです。

減算を行う場合でも、加算で実現されます。
乗算や除算を行う場合は、シフト演算を使用します。

シフト演算は、ビット単位でのデータの移動操作を行う演算であり、「論理左シフト」、「論理右シフト」、「算術左シフト」、「算術右シフト」の4種類があります。

乗算や除算をおこなうシフト演算

乗算や除算で利用するシフト演算は、ビット単位でデータの移動操作を行う演算です。

データを効率的に移動させることができるため、データ圧縮やビットマスクの生成、データ処理の最適化などにも利用されます。

シフト演算には「論理シフト」と「算術シフト」の2種類があります。

論理シフトは符号を無視してビット列をシフトする演算で、符号を考慮しないビットパターンの操作に使用されます。

一方、算術シフトは符号を考慮してビット列をシフトする演算です。

例えば、符号付き整数の-8に対して、それぞれシフト演算してみましょう。

  1. まず、-8を2進数に変換します。変換の方法は以下です。

    (ア)-8の絶対値を2進数で表現します。8の2進数表現は「00001000」です。
    (イ)各ビットを反転させます。これにより「11110111」が得られます。
    (ウ)得られた結果に1を加えます。これにより「11111000」が得られます。

    したがって、符号付き整数の-8を2進数に変換すると「11111000」となります。
     
  2. この「11111000」をそれぞれシフト演算してみます。

    (ア)論理左シフト
       最上位ビットを左にシフトし、最下位ビットには0を入れます。

   11111000(-8) → 11110000(-16)

   nビットを左シフトした場合は、元の値の2のn乗倍となります。
   つまり、1ビット左シフトした場合は、2倍となります。

  (イ)論理右シフト
     最上位ビットを右にシフトし、最上位ビットには0を入れます。

     11111000(-8) → 01111100(124)

     論理右シフトでは、符号ビットの位置が変わらず、新たに追加されるビットは常に0となります。

  (ウ)算術左シフト
     先頭の符号ビットを固定し、残りの7ビットを左にシフトします。
     空いた最下位ビットには0を入れます。

     11111000(-8) → 11110000(-16)

     このケースでは、結果的に論理左シフトと同じ結果が得られます。

  (エ)算術右シフト
     先頭の符号ビットを固定し、残りの7ビットを右にシフトします。
     空いたビットには符号ビットを入れます。
     ここでは符号ビットは1なので、1を入れます。

     11111000(-8) → 11111100(-4)

過去問にチャレンジ

シフト演算に関しては、過去に次のような問題が出題されています。

【問1】
10進数の演算式7÷32の結果を2進数で表したものはどれか。(平成25年秋期 午前問2)

この問題を解くには、16進数ABCDを2進数に変換してから、2ビット論理右シフトします。

  1. 16進数ABCDを2進数に変換すると次のようなビット列になります。

    1010 1011 1100 1101
  2. 2ビット論理右シフトする処理は、右にシフトさせ空いたビットに0を埋めます。すると、以下のビット列になります。

    0010 1010 1111 0011
  3. 最後にこれを4ビットずつまとめて16進数に戻します。

    2AF3

「2AF3」が答えです。

【問2】
8ビットの2進数11010000を右に2ビット算術シフトしたものを、00010100から減じた値はどれか。ここで,負の数は2の補数表現によるものとする。(平成24年秋期 午前問1)

この問題は、まず、2ビット算術右シフトしてから、10進数にして計算します。

  1. 8ビットの2進数11010000を2ビット算術右シフトします。算術右シフトは、先頭ビットを固定し、残り7ビットを右にシフトさせてから、空いたビットに最上位ビットをコピーするので、次のようになります。

    11110100
     
  2. 上の11110100は負の数であるので、2の補数を求めます。2の補数は、各ビットを反転させて、最後に1を加えたものです。

    11110100の反転 → 00001011
    00001011 + 1 = 00001100
     
  3. さらに求めた00001100を10進数にします。

    2^3 + 2^2 = 8 + 4 = 12
     
    負の数なのでマイナスをつけます。つまり、8ビットの2進数11010000を2ビット算術右シフトした値は、-12になります。
     
  4. 同様に、減ずる00010100を10進数にします。

    2^4 + 2^2 = 16 + 4 = 20
     
  5. これらを計算すると、

    20 - (-12) = 32
     
  6. 求められた32を2進数に変換して

    32 = 2^5 = 00100000

「00100000」が答えです。

まとめ

今回は算術演算で使われるシフト演算について説明しました。
シフト演算などの算術演算は、それだけで出題されることはほとんどなく、2進数や10進数への基数変換などと絡めた形で出題されることが多いです。基数変換などと合わせてしっかり復習しておきましょう。

次回は、確率・統計について説明することにします。
確率と統計の基本的な用語や概念、確率分布や統計的な推測方法、データの集計や解析方法などが出題の対象となることがあります。

次回もよろしくお願いします。


よろしければ、本コラムの感想をお聞かせください!
読者の皆様から頂いたご意見を基に、改善・改良してまいります✊

https://forms.gle/7VqULDSagvdYS4q4A


過去の連載記事

  1. 未経験者が基本情報技術者試験の受験勉強を始める前に読んでほしい事
facebook シェアシェア
LINE シェアシェア