ビット演算子

ビット演算子とは整数型の数値に対してビット単位で演算を行うときに使用する演算子です。ビット 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 $num;

$num = 11;
$num = $num & 14;

上記の結果として変数 $num には数値の 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 $num;

$num = 10;
$num = $num | 12;

上記の結果として変数 $num には数値の 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 $num;

$num = 10;
$num = $num ^ 12;

上記の結果として変数 $num には数値の 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 $num;

$num = 10;
$num = ~$num;

上記の結果として変数 $num には数値の 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";

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

perl sample.pl

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

ビット演算子(1)

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

-- --

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

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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