ビット演算子
ビット演算子とは整数型の数値に対してビット単位で演算を行うときに使用する演算子です。ビット AND やビット OR などの他にシフト演算子などが利用できます。ここでは Perl におけるビット演算子の使い方について解説します。
(Last modified: )
ビット演算子の種類
ビット演算子とは数値に対してビット単位で演算を行うための演算子です。ビット演算子には次のものが用意されています。
演算子 | 記述例 | 意味 |
---|---|---|
& | a = b & 10 | ビットAND |
| | a = b | 10 | ビットOR |
^ | a = b ^ 10 | ビットXOR |
~ | a = ~a | ビットNOT |
<< | a = a << 2 | 左シフト |
>> | a = a >> 2 | 右シフト |
ビット演算子の中で左シフトと右シフトはシフト演算子とも呼ばれます。シフト演算子については次のページで確認します。ではそれぞれの演算子について確認してみます。
ビットAND
ビット AND は演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットが共に 1 の場合だけ 1 にします。
例として 11 と 14 のビット AND を取ってみます。
1011 = 11 1110 = 14 ------------ 1010 = 10
対象となる数値の 11 と 14 をそれぞれ 2 進数で表します。そして各ビットを比較しますがビット AND の場合は両方の値のビットが 1 になっている場合は 1 、それ以外は 0 とします。その結果、2進数の 1010 (10進数の 10 )を取得することができます。
my $var; $var = 11; $var = $var & 14;
上記の結果として変数 $var には数値の 10 が格納されます。
ビットOR
ビット OR は演算子の左辺と右辺の同じ位置にあるビットを比較して、両方のビットの少なくとも 1 つが 1 の場合に 1 にします。両方とも 0 の場合は 0 となります。
例として 10 と 12 のビット OR を取ってみます。
1010 = 10 1100 = 12 ------------ 1110 = 14
対象となる数値の 10 と 12 をそれぞれ 2 進数で表します。そして各ビットを比較しますがビット OR の場合はどちらかの値のビットが 1 になっている場合は 1を、それ以外は 0 とします。その結果、2進数の 1110 (10 進数の 14 )と言う結果を取得することができます。
my $var; $var = 10; $var = $var | 12;
上記の結果として変数 $var には数値の 14 が格納されます。
ビットXOR
ビット XOR は演算子の左辺と右辺の同じ位置にあるビットを比較して、ビットの値が異なる場合にだけ 1 にします。
例として 10 と 12 のビット XOR を取ってみます。
1010 = 10 1100 = 12 ------------ 0110 = 6
対象となる数値の 10 と 12 をそれぞれ 2 進数で表します。そして各ビットを比較しますがビット XOR の場合は 2 つの値のビットの値が異なっている場合は 1 、それ以外は 0 とします。その結果、 2 進数の 0110 ( 10 進数の 6 )と言う結果を取得することができます。
my $var; $var = 10; $var = $var ^ 12;
上記の結果として変数 $var には数値の 6 が格納されます。
ビットNOT
ビット NOT は演算子の右辺の値の各ビットに対して 1 の場合は 0 に、 0 の場合は 1 にします。
例として 10 のビット NOT を取ってみます。
00000000000000000000000000001010 = 10 -------------------------------------- 11111111111111111111111111110101 = 4294967285
対象となる数値の 10 を 2 進数で表します。そしてビット NOT の場合はビットが 1 の場合は 0 、ビットが 0 の場合は 1とします。その結果、2進数の 11111111111111111111111111110101 ( 10 進数の 4294967285 )と言う結果を取得することができます。
ビット NOT の場合、整数として扱うことができる 32 ビットの値として反転します( 64 ビットマシンを使っていた場合は 64 ビットの値として反転させます)。 0101 となるわけでないので注意して下さい。
my $var; $var = 10; $var = ~$var;
上記の結果として変数 $var には数値の 4294967285 が格納されます。
では簡単なプログラムで確認して見ます。
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 & 14; print "$src \& 14 = $dst\n"; $src = 10; $dst = $src | 12; print "$src | 12 = $dst\n"; $src = 10; $dst = $src ^ 12; print "$src ^ 12 = $dst\n"; $src = 10; $dst = ~$src; print "~$src = $dst\n";
上記を「test6-1.pl」の名前で保存します(文字コードはUTF-8です)。そしてコマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。
( Written by Tatsuo Ikura )

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