基本情報技術者

【基本情報技術者試験】シフト演算

2021年8月15日

今回のテーマはシフト演算、以下は基本情報技術者試験で過去に出題されたシフト演算の問題です。
むずかしい・・・

問題

数値を2進数で表すレジスタがある。このレジスタに格納されている正の整数xを10倍する操作はどれか。ここで,桁あふれは,起こらないものとする。

  • ア:xを2ビット左にシフトした値にxを加算し,更に1ビット左にシフトする。
  • イ:xを2ビット左にシフトした値にxを加算し,更に2ビット左にシフトする。
  • ウ:xを3ビット左にシフトした値と,xを2ビット左にシフトした値を加算する。
  • エ:xを3ビット左にシフトした値にxを加算し,更に1ビット左にシフトする。

基本情報技術者平成29年秋期 午前問1

問題

32ビットのレジスタに16進数ABCDが入っているとき,2ビットだけ右に論理シフトしたときの値はどれか。

ア:2AF3  イ:6AF3  ウ:AF34  エ:EAF3

基本情報技術者平成25年秋期 午前問2

基本情報技術者試験の過去問だけを見ると難しく感じるシフト演算の問題。ただ、シフト演算の動きを理解してしまえば簡単に解くことができます。

本記事では「シフト演算」について図解で分かりやすく解説していきます。

本記事で学べること

  • シフト演算の論理シフトと算術シフトを理解
  • 基本情報技術者試験の過去問の解き方を学ぶ

シフト演算とは

シフト演算とは、2進数をあらわすビット列を左または右にずらす操作のことです。

例えば、10進数で考えると「770」という数字を10倍すると「7700」、1/10倍すると「77」となり、10倍は1桁増やす操作(左にシフトする)であり、1/10倍は1桁減らす操作(右にシフトする)です。

この操作は2進数でも同じであり、「100」(10進数:4)という2進数を2倍すると「1000」(10進数:8)になり、1/2倍すると「10」(10進数:2)になります。

シフト演算

このように、ビット列を左にずらす(左にシフト)と元の値の2倍右にずらす(右にシフト)と元の値の1/2倍という計算結果を簡単に得ることができます。コンピュータはこのシフト演算を使い、掛け算や割り算をおこなっています。

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

論理シフト

論理シフトとは、符号を考慮しないシフト演算のことです。

スポンサーリンク

左論理シフト

ビット列全体を左にずらす論理シフトのことを「左論理シフト」といいます。

以下は左論理シフトのイメージ例です。※8ビットの例

2進数「00001100」(10進数:12)を左に2ビットシフトすると元の数を22(12 × 2 × 2 = 48)にした値を得ることができます。

論理シフトとは

左論理シフトでは、あふれたビットを捨てます。ただし「0」ではなく「1」があふれた場合は、オーバーフローとなり、ビット列であらわせる数の限界を超えてしまうという現象が発生します。

右論理シフト

ビット列全体を右にずらす論理シフトのことを「右論理シフト」といいます。

以下は右論理シフトの例です。※8ビットの例

2進数「00001100」(10進数:12)を右に2ビットシフトすると元の数を1/22(12 × 1/2 × 1/2 = 3)にした値を得ることができます。

右論理シフト

算術シフト

算術シフトとは、符号を考慮するシフト演算のことです。算術シフトでは、先頭の1ビットを符号ビット(正 = 0、負 = 1)として扱います。

左算術シフト

ビット列全体を左にずらす算術シフトのことを「左算術シフト」といいます。

以下は左算術シフトのイメージ例です。※8ビットの例

先頭の符号ビットは固定なので、シフト操作は残りの7ビットに対して行われます。2進数「11100100」(10進数:-28)を左に2ビットシフトすると元の数を22(-28 × 2 × 2 = -112)にした値を得ることができます。

左算術シフト

左算術シフトでは、あふれたビットを捨てます。ただし符号ビットと異なる値があふれた場合は、オーバーフローとなり、ビット列であらわせる数の限界を超えてしまうという現象が発生します。

スポンサーリンク

右算術シフト

ビット列全体を右にずらす算術シフトのことを「右算術シフト」といいます。

以下は右算術シフトのイメージ例です。※8ビットの例

先頭の符号ビットは固定なので、シフト操作は残りの7ビットに対して行われます。(右算術シフトでは空いたビットには0ではなく符号ビットが入る)

2進数「11100100」(10進数:-28)を右に2ビットシフトすると元の数を1/22(-28 × 1/2 × 1/2 = -7)にした値を得ることができます。

右算術シフト

基本情報技術者試験 過去問の解説

基本情報技術者平成29年秋期 午前問1

問題

数値を2進数で表すレジスタがある。このレジスタに格納されている正の整数xを10倍する操作はどれか。ここで,桁あふれは,起こらないものとする。

  • ア:xを2ビット左にシフトした値にxを加算し,更に1ビット左にシフトする。
  • イ:xを2ビット左にシフトした値にxを加算し,更に2ビット左にシフトする。
  • ウ:xを3ビット左にシフトした値と,xを2ビット左にシフトした値を加算する。
  • エ:xを3ビット左にシフトした値にxを加算し,更に1ビット左にシフトする。

この問題はア~エの文章を式に変えて計算することで、答えを求めることができます。

ポイント

nビット左シフトは2n

nビット右シフトは1/2n

アを求める

  • xを2ビット左にシフト:「x × 22 = x × 4 = 4x」・・・①
  • ①にxを加算:「4x + x = 5x」・・・②
  • ②を更に1ビット左にシフト:「5x × 21 = 5x × 2 = 10x

イを求める

  • xを2ビット左にシフト:「x × 22 = x × 4 = 4x」・・・①
  • ①にxを加算:「4x + x = 5x」・・・②
  • ②を更に2ビット左にシフト:「5x × 22 = 5x × 4 = 20x

ウを求める

  • xを3ビット左にシフト:「x × 23 = x × 8 = 8x」・・・①
  • xを2ビット左にシフト:「x × 22 = x × 4 = 4x」・・・②
  • ①と②を加算:「8x + 4x = 12x

エを求める

  • xを3ビット左にシフト:「x × 23 = x × 8 = 8x」・・・①
  • ①にxを加算:「8x + x = 9x」・・・②
  • ②を更に1ビット左にシフト:「9x × 21 = 9x × 2 = 18x
計算した結果、正の整数 x を10倍する操作は「ア」です。

基本情報技術者平成25年秋期 午前問2

問題

32ビットのレジスタに16進数ABCDが入っているとき,2ビットだけ右に論理シフトしたときの値はどれか。

ア:2AF3  イ:6AF3  ウ:AF34  エ:EAF3

この問題は、16進数「ABCD」を2進数に変換し、2ビット右論理シフトを実施して得られた結果を16進数に戻すことで求めることができます。

右論理シフト

求め方

[16進数ABCDを2進数に変換する]

1010 1011 1100 1101・・・①

(16進数→2進数の変換:A→1010、B→1011、C→1100 、D→1101)

[①を2ビット右に論理シフトする]

0010 1010 1111 0011 01・・・②

[②を16進数に戻す]

2AF3

(2進数→16進数の変換:0010→2、1010→A、1111→F、0011→3)

計算した結果、16進数「2AF3」となり「ア」が正解です。

helpful