キャリテク!マガジン
- TOP
- キャリテク!マガジン
- シフト演算はコンピュータの基本的な演算
シフト演算はコンピュータの基本的な演算
こんにちは。小澤です。
基本情報技術者試験に向けた学習は進んでいますか?
毎日少しずつでも学習に取り組むことで、自分の理解度を確認しながら進めることができます。コツコツと進めていきましょう。
さて、今回は、算術演算について理解を深めることにします。
『徹底攻略 基本情報技術者試験教科書 令和5年度』では、「1−4 算術演算」(40ページ〜43ページ)の内容です。
算術演算は、数値に対して行われる演算であり、加算・減算・乗算・除算などがその例です。
しかし、コンピュータの世界での算術演算は一般的なものとは少し異なり、シフト演算という処理で行われます。
シフト演算を含めた算術演算は、プログラムの作成やデータ処理をよりスムーズに行うために重要なスキルです。
基本情報技術者試験では、全体を通じて知識が問われる問題が多いですが、算術演算は計算することで確実に得点できる問題です。
シフト演算は普段使うものではないので、少し戸惑うところもあるかもしれませんが、ぜひマスターしましょう。
コンピュータが持つ演算機能は加算のみ
算術演算とは、通常2つの数値を足したり引いたりする処理を指しますが、コンピュータが持つ演算機能は実際には加算のみです。
減算を行う場合でも、加算で実現されます。
乗算や除算を行う場合は、シフト演算を使用します。
シフト演算は、ビット単位でのデータの移動操作を行う演算であり、「論理左シフト」、「論理右シフト」、「算術左シフト」、「算術右シフト」の4種類があります。
乗算や除算をおこなうシフト演算
乗算や除算で利用するシフト演算は、ビット単位でデータの移動操作を行う演算です。
データを効率的に移動させることができるため、データ圧縮やビットマスクの生成、データ処理の最適化などにも利用されます。
シフト演算には「論理シフト」と「算術シフト」の2種類があります。
論理シフトは符号を無視してビット列をシフトする演算で、符号を考慮しないビットパターンの操作に使用されます。
一方、算術シフトは符号を考慮してビット列をシフトする演算です。
例えば、符号付き整数の-8に対して、それぞれシフト演算してみましょう。
- まず、-8を2進数に変換します。変換の方法は以下です。
(ア)-8の絶対値を2進数で表現します。8の2進数表現は「00001000」です。
(イ)各ビットを反転させます。これにより「11110111」が得られます。
(ウ)得られた結果に1を加えます。これにより「11111000」が得られます。
したがって、符号付き整数の-8を2進数に変換すると「11111000」となります。
- この「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)
過去問にチャレンジ
シフト演算に関しては、過去に次のような問題が出題されています。
10進数の演算式7÷32の結果を2進数で表したものはどれか。(平成25年秋期 午前問2)
この問題を解くには、16進数ABCDを2進数に変換してから、2ビット論理右シフトします。
- 16進数ABCDを2進数に変換すると次のようなビット列になります。
1010 1011 1100 1101 - 2ビット論理右シフトする処理は、右にシフトさせ空いたビットに0を埋めます。すると、以下のビット列になります。
0010 1010 1111 0011 - 最後にこれを4ビットずつまとめて16進数に戻します。
2AF3
「2AF3」が答えです。
8ビットの2進数11010000を右に2ビット算術シフトしたものを、00010100から減じた値はどれか。ここで,負の数は2の補数表現によるものとする。(平成24年秋期 午前問1)
この問題は、まず、2ビット算術右シフトしてから、10進数にして計算します。
- 8ビットの2進数11010000を2ビット算術右シフトします。算術右シフトは、先頭ビットを固定し、残り7ビットを右にシフトさせてから、空いたビットに最上位ビットをコピーするので、次のようになります。
11110100
- 上の11110100は負の数であるので、2の補数を求めます。2の補数は、各ビットを反転させて、最後に1を加えたものです。
11110100の反転 → 00001011
00001011 + 1 = 00001100
- さらに求めた00001100を10進数にします。
2^3 + 2^2 = 8 + 4 = 12
負の数なのでマイナスをつけます。つまり、8ビットの2進数11010000を2ビット算術右シフトした値は、-12になります。
- 同様に、減ずる00010100を10進数にします。
2^4 + 2^2 = 16 + 4 = 20
- これらを計算すると、
20 - (-12) = 32
- 求められた32を2進数に変換して
32 = 2^5 = 00100000
「00100000」が答えです。
まとめ
今回は算術演算で使われるシフト演算について説明しました。
シフト演算などの算術演算は、それだけで出題されることはほとんどなく、2進数や10進数への基数変換などと絡めた形で出題されることが多いです。基数変換などと合わせてしっかり復習しておきましょう。
次回は、確率・統計について説明することにします。
確率と統計の基本的な用語や概念、確率分布や統計的な推測方法、データの集計や解析方法などが出題の対象となることがあります。
次回もよろしくお願いします。
よろしければ、本コラムの感想をお聞かせください!
読者の皆様から頂いたご意見を基に、改善・改良してまいります✊