シフト演算子の使い方

シフト演算子とはビット演算子の一つで数値の各ビットを左又は右へシフトさせるための演算子です。ここでは Ruby でシフト演算子を使う方法について解説します。

(Last modified: )

シフト演算子の一覧

シフト演算子はビット演算子の一つで数値の各ビットを左又は右へシフトさせるための演算子です。シフト演算子には次のものが用意されています。

演算子記述例意味
<<a << b左シフト
>>a >> b右シフト

ビット演算子と同じく対象の値を 2 進数のビットとして考え、ビットを左又は右へシフトさせます。なお 2 進数において左へ 1 つビットをシフトさせることは値を 2 倍することに相当し、右へ 1 つビットをシフトさせることは値を 1/2 にすることに相当します。

※演算子の優先順位については「演算子の優先順位(関係演算子、論理演算子)」を参照して下さい。

左シフト

左シフト 演算子は左辺の数値を右辺の値だけ左へシフトします。

a << b

例として 11 を 1 ビット左へシフトさせてみます。

0000000000001011 = 11
-----------------------
0000000000010110 = 22

各ビットを指定した数だけ左へシフトします。左端からはみ出した部分は削除され、シフトしたことによって空いた右端は 0 が格納されます。結果として 11 を 1 ビット左へシフトすると 22 となります。

num1 = 11
num2 = 1
print(num1 << num2)

上記では結果として 22 が出力されます。

右シフト

右シフト 演算子は左辺の数値を右辺の値だけ右へシフトします。

a >> b

例として 11 を 1 ビット右へシフトさせてみます。

0000000000001011 = 11
-----------------------
0000000000000101 = 5

各ビットを指定した数だけ右へシフトします。右端からはみ出した部分は削除され、シフトしたことによって空いた右端には、元々の値が 1 だった場合は 1 が格納され、 0 だった場合は 0 が格納されます。数値の符号はそのままということです。

num1 = 11
num2 = 1
print(num1 >> num2)

上記では結果として 5 が出力されます。

今度は負のである -10 を 1 ビット右へシフトさせてみます。

1111111111110110 = -10
-----------------------
1111111111111011 = -5

負の数を右シフトする場合は、左側に 1 がずっと並んでいるものと考えて下さい。シフトした分だけ左側には 1 が格納されますので符号は変わりがありません。

サンプルコード

では簡単なプログラムで確認してみます。

# encoding: UTF-8

num1 = 11
num2 = 1
print(num1, " << ", num2, " = ", num1 << num2, "\n")
print(num1, " >> ", num2, " = ", num1 >> num2, "\n")

num2 = 2
print(num1, " << ", num2, " = ", num1 << num2, "\n")
print(num1, " >> ", num2, " = ", num1 >> num2, "\n")

num1 = -10
num2 = 1
print(num1, " >> ", num2, " = ", num1 >> num2, "\n")

下記のように実行して下さい。

シフト演算子

-- --

Ruby でシフト演算子を使う方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。