シフト演算(shift operation)

ビットの並びを左右にずらす演算。左へ1ビットで2倍、右へ1ビットで2分の1になる。

もう少し詳しい説明

シフト演算は、ビットの並びを左右にずらす演算です。

ずらすと、どの桁も重みが2倍(または半分)の桁へ移るので、値全体が2倍・半分になります。10進数で数字を1桁左へずらすと10倍になるのと同じ理屈で、2進数では2倍です。

左へずらす:2倍ずつになる

500000101左へ1ビット → 1000001010左へ2ビット → 2000010100
ビットの並びを左へ1つずらすと、どの桁も重みが2倍の桁へ移るので、値全体が2倍になります。空いた右端には0が入ります。左へ2ビットなら4倍、3ビットなら8倍です。

5(00000101)を左へ1ビットずらすと 00001010 = 10。もう1ビットずらすと 00010100 = 20 です。空いた右端には0が入ります。

ずらすビット数値は
左へ1ビット2倍
左へ2ビット4倍
左へ3ビット8倍
左へ n ビット2ⁿ 倍

右へずらすと、逆に2分の1になります。5(00000101)を右へ1ビットずらすと 00000010 = 2。はみ出た右端の1は捨てられるので、端数は切り捨てになります。

掛け算をシフトと足し算で作る

ここが試験でよく出ます。コンピュータにとって、シフトは掛け算よりずっと速い処理です。そこで、掛け算を「2のべき乗の足し算」に分けて、シフトで計算することがあります。

たとえば x を10倍したいとき。10 は 8 + 2 に分けられます。

10x = 8x + 2x = (x を左へ3ビット)+(x を左へ1ビット)

x = 5 で確かめると、左へ3ビットで40、左へ1ビットで10、足して 50。確かに5の10倍です。

同じように、5倍なら 4 + 1(左へ2ビット + そのまま)、6倍なら 4 + 2(左へ2ビット + 左へ1ビット)と組み立てられます。

論理シフトと算術シフト

ずらしたときに空いた場所に何を入れるかで、2種類に分かれます。

種類空いた場所に入れるもの向いている数
論理シフトいつも 0符号のない数
算術シフト右シフトなら符号ビットと同じ値補数で表した負の数も含む数

違いが出るのは、負の数を右へずらすときです。

−811111000論理右シフト → 12401111100算術右シフト → −411111100
−8 を右へ1ビットずらした結果です。論理シフトは空いた左端に0を入れるので、先頭が0になって正の数(124)に変わってしまいます。算術シフトは符号のビットと同じ値(1)を入れるので、正しく半分の −4 になります。色の付いた左端が、新しく入ったビットです。

−8 は、8ビットの2の補数で 11111000 です。これを右へ1ビットずらします。

算術シフトは、符号ビットを動かさない(保つ)シフトです。負の数を2で割りたいときは、こちらを使います。

ただし、負の奇数では答えが小さいほうへ切り捨てられます。−5(11111011)を算術右シフトすると 11111101 = −3 で、−2.5 を −2 ではなく −3 にしています。正の数の右シフト(5 → 2)とは、切り捨てる向きが逆になる点に注意してください。

算術左シフトでは、符号ビットはそのまま残し、それ以外のビットを左へずらして右端に0を入れます。

左へずらしすぎると

左へずらすと、左端からはみ出たビットは捨てられます。ずらしすぎて意味のあるビットがはみ出ると、値が正しく表せなくなります。これを**オーバフロー(桁あふれ)**と呼びます。試験の問題文に「桁あふれは起こらないものとする」と書いてあるのは、この心配をしなくてよい、という意味です。

覚え方:1ビットで2倍、符号を守るのが算術

掛け算の問題は、倍率を2のべき乗の和に分けることから始めてください。10 = 8 + 2、12 = 8 + 4、というように分ければ、あとは何ビットずらすかを読み替えるだけです。

試験ではこう出る

科目A(旧・午前)の基礎理論分野で出ます。多いのは、「左に◯ビットシフトしたものと、左に◯ビットシフトしたものを足すと何倍か」という掛け算の組み立てを問う問題と、ビット列をシフトした結果を答えさせる問題です。応用情報では、論理シフトと算術シフトの違いを、負の数を例にして問う形になります。

倍率の問題は、ビット数ではなく倍率(2のビット数乗)を足すのが要点です。左へ3ビットと1ビットなら「3+1=4倍」ではなく「8+2=10倍」。ここを取り違えた値が、決まって選択肢に入っています。

関連する用語

基数変換
10進数・2進数・16進数を書き直すこと。シフトで値が2倍になる理由は桁の重みにある
補数
負の数を2進数で表す形。負の数をずらすときは、符号を保つ算術シフトを使う
論理回路
0と1の入力から0か1を返す回路。シフトも回路で作られている
オーバフロー
結果が決まったビット数に収まらなくなること。左へずらしすぎると起こる

ミニクイズ

桁あふれは起こらないものとする。正の整数 x を、2進数で左に3ビットシフトした値と、左に1ビットシフトした値を足すと、x の何倍になるか。

正解は 3番:10倍

左に1ビットシフトすると2倍、2ビットで4倍、3ビットで8倍になります。つまり、左に3ビットシフトした値は8x、左に1ビットシフトした値は2x です。足すと 8x + 2x = 10x で、10倍になります。4倍はシフトしたビット数の3と1をそのまま足した値で、ビット数と倍率を取り違えています。6倍は 8x − 2x と引き算してしまった値、16倍は8倍と2倍を掛けた値で、どちらも足し算になっていません。掛け算の問題を「2のべき乗の足し算」に分けて考える、という考え方がこの問題の要点です。

間違えた用語の復習リストを見る →

最終更新:2026-09-21