シフト演算子

ビット演算子の中でも数値の各ビットを左または右へシフトさせるときに使用する演算子がシフト演算子です。ここでは Perl におけるシフト演算子の使い方について解説します。

(Last modified: )

シフト演算子の種類

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

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

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

左シフト

左シフトから確認してみます。 << 演算子を使います。例として 11 を 1 ビット左へシフトさせてみます。

00000000000000000000000000001011  = 11
---------------------------------------
00000000000000000000000000010110  = 22

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

それでは Perl のプログラムでシフト演算子を使用してみます。

my $var;

$var = 11;
$var = $var << 11;

上記の結果として変数 $var には数値の 22 が格納されます。

右シフト

次に右シフトです。 >> 演算子を使います。例として 11 を 1 ビット右へシフトさせてみます。

00000000000000000000000000001011  = 11
---------------------------------------
00000000000000000000000000000101  = 5

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

それでは Perl のプログラムでシフト演算子を使用してみます。

my $var;

$var = 11;
$var = $var >> 11;

上記の結果として変数 $var には数値の 5 が格納されます。

なお負の値に対して右シフトした場合、プログラム言語によっては左端に 1 が格納されるものもありますが、Perlでは負の値であっても左端には 0 が格納されます。

サンプルコード

それでは簡単なサンプルを作成します。

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

my ($src, $dst);

$src = 11;
$dst = $src << 1;
print "$src << 1 = $dst\n";

$src = 11;
$dst = $src >> 1;
print "$src >> 1 = $dst\n";

テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。

perl sample.pl

次のように実行結果が表示されます。

シフト演算子(1)

変数に格納した値に対してシフト演算子を使って演算を行ったあと、結果を画面に表示しました。

-- --

Perl におけるシフト演算子の使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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