シフト演算子
シフト演算子はビット演算子の一つで数値の各ビットを左又は右へシフトさせるための演算子です。
演算子 | 記述例 | 意味 |
---|---|---|
<< | 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」が格納されますので符号は変わりがありません。
サンプルプログラム
では簡単なプログラムで確認して見ます。
#! ruby -Ku 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")
上記のプログラムを「test7-1.rb」として保存します。文字コードはUTF-8です。そして下記のように実行して下さい。
( Written by Tatsuo Ikura )