MENU

基本情報技術者試験シフト演算を超やさしく解説

基本情報技術者試験のシフト演算やビット演算の問題を見て、2進数のビットシフトとか左シフト右シフトとか書いてあって「もう無理…」ってなったことありませんか。論理シフトや算術シフトの違いもよくわからないし、桁あふれやオーバーフローまで出てきて、一気にテンションが下がるポイントかなと思います。

さらにシフト演算とは何かがあいまいなまま、シフト演算の過去問や例題を解こうとしても「どっち向きに何ビットずらすの?」で手が止まりやすいんですよね。2の乗数以外の乗算除算の計算方法や、符号付き整数での算術シフトの扱いも、最初はイメージがつきにくいところだと思います。

でも安心してください。シフト演算は、仕組みさえつかめば「ビットをズラして×2や÷2にしているだけ」という、とてもシンプルな世界です。このページでは、あなたが基本情報技術者試験のシフト演算をスッキリ理解して、過去問レベルの問題を自分の力で解けるようになるところまで、ラフな言葉でやさしく解説します。

この記事で分かること
  • 基本情報技術者試験のシフト演算が何をしているかイメージできる
  • 左シフト右シフトと論理シフト算術シフトの違いを説明できる
  • 2進数のシフト演算を使って×2・÷2の計算を素早くこなせる
  • 過去問レベルのシフト演算問題をどんな手順で解けばいいかイメージできる
目次

基本情報技術者試験のシフト演算とは?

  • シフト演算とは何かをざっくりイメージ
  • 左シフトと右シフトで何が変わる?
  • 基本情報技術者試験でのシフト演算の出題パターン

ここでは、シフト演算の全体像をざっくりつかんで、「なんでこれを勉強させられているのか?」というモヤモヤを片付けていきます。まずは細かい用語よりも、イメージ優先で読んでみてください。

シフト演算とは何かをざっくりイメージ

シフト演算は、一言でいうと「ビット列を左右にズラす操作」です。ビット列というのは、0と1が並んだ2進数のデータのことですね。

たとえば、8ビットのレジスタにこんな値が入っているとします。

2進数10進数の値
0001 010020

このビット列を左に1ビットシフトする、というのは「みんなを左に1マスずらす」イメージです。左端からはみ出したビットは消えて、右端に新しいビットが入ってきます。

結果はこうなります。

操作2進数10進数
元の値0001 010020
左に1ビットシフト0010 100040(=20×2)

つまり、左に1ビットシフト=2倍になっているわけです。逆に右に1ビットシフトすると、2分の1(割り算)になります。

シフト演算のざっくりイメージ

  • 左シフト → 桁を左にズラす → ×2、×4、×8…になる
  • 右シフト → 桁を右にズラす → ÷2、÷4、÷8…になる
  • はみ出したビットは消えるので、戻ってこない

この「桁をズラすと×2や÷2になる」という感覚は、10進数でも同じです。350を10倍すると3500、1/10にすると35になりますよね。2進数でも、左に1桁シフトすると2倍、右に1桁シフトすると1/2倍になる、というだけです。

2進数の基礎が不安なら
もし「2進数自体が怪しいかも…」という感覚があるなら、先に基本情報のn進数を完全攻略できる2進数と16進数の解説ページを読んでから戻ってくると、シフト演算の理解が一気にラクになります。

左シフトと右シフトで何が変わる?

次に、「左シフト」と「右シフト」をもう少しだけ丁寧に整理してみます。ここからはビットシフトという言い方も出てきますが、ざっくり同じ意味だと思って大丈夫です。

左シフト(上位桁側へズラす)

左シフトは、値を大きくしたいときのシフトです。1ビット左シフトで×2、2ビット左シフトで×4、3ビット左シフトで×8…という感じで、2の乗数倍になっていきます。

ただし、レジスタのビット数には上限があるので、上位桁からはみ出したビットは消えます。これが「桁あふれ(オーバーフロー)」です。

右シフト(下位桁側へズラす)

右シフトは、値を小さくしたいときのシフトです。1ビット右シフトで1/2、2ビット右シフトで1/4…と、2で割った結果に近い値になります。

割り切れない場合の端数は、基本的に切り捨てになります。ここも試験でよく聞かれるポイントです。

左シフトと右シフトの比較(イメージ)

操作2進数(8ビット)10進数意味
元の値0001 100024スタート
左に2ビットシフト0110 00009624×4(2ビット分左シフト)
右に2ビットシフト0000 0110624÷4(2ビット分右シフト)

基本情報技術者試験でのシフト演算の出題パターン

基本情報技術者試験では、シフト演算だけポツンと出てくるというよりも、算術演算全体の中の一テーマとして出てくることが多いです。たとえば、2進数の加算減算乗算除算の流れの中で「ここはシフトで計算するよ」という形で聞かれたりします。

算術演算の全体像を整理しておきたいときは、加減乗除と2進数の関係をまとめた基本情報の算術演算を解説したページもセットで読んでもらえると、頭の中の地図がかなりクリアになるはずです。

また、試験の科目Bでは、アルゴリズム問題の中で「ビットを何ビット右シフトして…」のように、処理の一部としてシフト演算が出てくるケースもあります。問題文で使われているレジスタのビット数(8ビットなのか16ビットなのか)と、はみ出したビットがどう扱われるかは、必ずチェックしておきましょう。

論理シフトと算術シフトをイメージで理解

  • 論理シフトの仕組みとよく出るパターン
  • 算術シフトで符号付き整数を扱う理由
  • シフト演算とかけ算・わり算の関係

シフト演算の第二ステップは、論理シフトと算術シフトの違いをしっかり押さえることです。ここが整理できると、「符号付き整数でも怖くないぞ」という感覚に変わってきます。

論理シフトの仕組みとよく出るパターン

論理シフトは、「空いたところに0を入れるシフト」です。符号付きかどうかは気にせず、とにかく機械的に0を詰めていきます。

論理左シフト

  • ビット列を左にズラす
  • 右端にあいた部分には0を入れる
  • 上位からはみ出したビットは捨てる

これは先ほどの左シフトのイメージそのままです。符号を意識しない符号なし整数の世界では、論理左シフト=×2の世界と思ってOKです。

論理右シフト

  • ビット列を右にズラす
  • 左端にあいた部分には0を入れる
  • 下位からはみ出したビットは捨てる

論理右シフトは、「単純に2で割っていく」イメージです。ただし、端数は切り捨てなので、正確には割り算というよりも「2で割って切り捨て」になっている点だけ意識しておきましょう。

よくある勘違い

  • 論理シフトと算術シフトをごっちゃにしてしまう
  • 符号付き整数でも論理右シフトしてしまう
  • 「空いたところに入る値」が0なのか符号ビットなのかを読み飛ばす

問題文で「論理シフト」なのか「算術シフト」なのかは、必ずチェックするクセをつけておきましょう。

算術シフトで符号付き整数を扱う理由

算術シフトは、符号付き整数(プラス・マイナスのある数)を扱うときに出てきます。ポイントは、左端の符号ビットを守りながらシフトすることです。

算術左シフト

実務でも試験でも、算術左シフトは論理左シフトと同じように扱われることが多く、「右側に0を入れていく×2のシフト」として出てきます。符号ビットも一緒に左に動くので、オーバーフローしない範囲で使うイメージです。

算術右シフト

算術右シフトでは、左側にできた空きに、元の符号ビット(0なら0、1なら1)をコピーして埋めていきます。こうすることで、マイナスの値を保ったまま2で割ったような結果になります。

たとえば、負の数を2の補数で表現しているとき、単純に論理右シフトしてしまうと、符号ビットが0になってしまい、「マイナスだったはずの値がプラスに見えてしまう」という事故が起こります。これを避けるために、算術右シフトでは符号ビットをコピーして埋めるわけですね。

論理シフトと算術シフトの違いまとめ

  • 論理シフト → 空いたところは0で埋める(符号は気にしない)
  • 算術シフト → 空いた左側は符号ビットで埋める(符号を守る)
  • 符号付き整数で右シフトするときは算術シフトを意識

シフト演算とかけ算・わり算の関係

シフト演算の実用的な意味は、「かけ算とわり算を高速にやるためのショートカット」です。CPU内部では、いちいち掛け算器を動かすよりも、ビットをズラすだけの方がずっと速くてシンプルに処理できます。

  • 左に1ビットシフト → ×2
  • 左にkビットシフト → ×2のk乗
  • 右に1ビットシフト → 2で割って切り捨て
  • 右にkビットシフト → 2のk乗で割って切り捨て

試験問題では、2の乗数以外(たとえば×6や×12)の乗算除算を、シフト演算と加算減算の組み合わせで表現する問題もよく出てきます。「×8してから×2を引く」「×4してから×1を足す」のようなイメージで、2進数の世界でも「暗算テクニック」を使っている感じですね。

シフト演算の計算手順と解き方トレーニング

  • 例題で慣れるシフト演算の基本ステップ
  • 桁あふれとオーバーフローの考え方
  • 科目B対策としてのシフト演算の勉強法
  • まとめと次にやるべき勉強ステップ

ここからは、実際に試験で出てくるようなシフト演算を、どんなステップで解いていけばいいのかを整理していきます。「問題文を見て固まる」を卒業して、「あ、このタイプね」とサクッと手を動かせる状態を目指しましょう。

例題で慣れるシフト演算の基本ステップ

シフト演算の問題を解くときのコツは、「手順をパターン化しておく」ことです。ここでは、よくあるパターンをシンプルなステップに分解してみます。

ステップ1:ビット列とレジスタの桁数を確認

まず、問題文に書かれているビット列とレジスタのビット数(8ビット、16ビットなど)を確認します。ここを見逃すと、オーバーフローの扱いを間違えやすくなります。

ステップ2:左か右か、何ビットシフトするかを確認

次に、「左に2ビット」「右に3ビット」のように、シフトの方向とビット数を確認します。このとき、頭の中で「×4だな」「÷8だな」というように、10進数のイメージに変換しておくと、計算後のざっくりしたチェックもしやすくなります。

ステップ3:空いた桁に入る値を確認

  • 論理シフトなら → 空いた桁は全部0
  • 算術シフトの右シフトなら → 左側は符号ビットで埋める

ここを読み飛ばすと、符号付き整数の問題で一気にミスが増えます。問題文に「論理右シフト」「算術右シフト」と書かれているかどうかを、必ず見るクセをつけておきましょう。

ステップ4:実際にビットをずらしてみる

最後に、紙の上でビット列を書き、実際にズラしてみます。慣れないうちは、いきなり頭の中だけでやろうとせず、きちんと手を動かした方がミスは減らせます。

シフト演算問題の4ステップ

  1. ビット列とレジスタの桁数を確認する
  2. 左か右か、何ビットシフトかを確認する
  3. 論理シフトか算術シフトかを確認する
  4. 紙にビット列を書いて、実際にズラしてみる

桁あふれとオーバーフローの考え方

シフト演算でよく一緒に聞かれるのが、「桁あふれ(オーバーフロー)」です。これは、決められたビット数を超えてしまうほど大きい(あるいは小さい)値を表そうとしたときに、一番外側にあふれたビットが捨てられてしまう現象です。

たとえば、8ビットのレジスタで1111 0000を左に1ビットシフトすると、本来は1 1110 0000ですが、9ビット目の1はレジスタに入りきらずに消えます。その結果、レジスタに残るのは1110 0000だけになります。

オーバーフローで気をつけたいこと

  • オーバーフローしても、レジスタに残っている値だけで判断される
  • 符号付き整数では、オーバーフローで符号がおかしくなることがある
  • 問題によっては、「オーバーフローが発生するか?」が問われる

シフト演算の結果だけでなく、「この操作でオーバーフローするかどうか」も確認するクセをつけておくと、得点しやすいです。

科目B対策としてのシフト演算の勉強法

科目Bでは、アルゴリズム問題の中にシフト演算が紛れ込んでいるパターンが増えています。ここで大事なのは、「シフト=×2や÷2」という感覚を体に覚えさせておくことです。

たとえば、「xを左に3ビットシフトしてからyを足す」という処理は、「xを8倍してからyを足す」と同じ意味になります。こういうイメージがパッと浮かぶようになると、処理の結果の桁の大きさも予想しやすくなります。

また、基本情報技術者試験では電卓の持ち込みができないので、画面上の簡易電卓と手計算で乗り切る必要があります。シフト演算を含めた計算対策の全体像は、計算テーマをまとめた基本情報技術者試験の電卓ルールとCBT対策のページもあわせてチェックしておくと安心です。

なお、試験制度や配点、出題範囲などは今後変更される可能性があります。正確な情報は必ずIPAなどの公式サイトで最新の案内を確認してください。また、勉強時間の配分や資格取得の位置づけなど、キャリア全体に関わる判断については、必要に応じてキャリアアドバイザーや専門家にも相談しながら決めていくことをおすすめします。

まとめと次にやるべき勉強ステップ

まとめと次にやるべき勉強ステップ

ここまで読んでくれたあなたは、少なくとも「シフト演算=ビットをズラして×2・÷2しているだけ」という感覚はつかめているはずです。

  • シフト演算は、ビット列を左右にシフトして値を変える操作
  • 左シフトは2の乗数倍、右シフトは2の乗数分の1(切り捨て)になる
  • 論理シフトと算術シフトの違いは、空いた桁を0で埋めるか、符号ビットで埋めるか
  • オーバーフローやレジスタのビット数も、セットで意識しておくと得点しやすい

次のステップとしては、

  • 2進数やn進数の変換 → シフト演算と相性がいい分野
  • 算術演算(加減乗除) → シフトと組み合わせた問題が多い
  • 科目Bのアルゴリズム問題 → シフトを使った処理の流れに慣れる

この3つを、少しずつ行き来しながら固めていくと、基本情報技術者試験の計算系の問題はかなり戦いやすくなります。シフト演算だけで完璧を目指すというよりも、「計算まわりの武器のひとつ」として、サラッと使いこなせる状態を目指していきましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次