数値として演算する
前回 (
0x221) に引き続き
ビット列演算子 (perlop) - perldoc.jp を参考にして「 ビット単位の文字列演算 」を確認します。
まずは、数値として計算する場合です。オペランドは共に 10 進数の整数です。
print 150 | 105, "\n";
これは、次の結果が得られます。
255
計算の内訳は次のようになっているはずです。
dec hex bin
-----------------
150 0x96 10010110
OR 105 0x69 01101001
--------------------
255 0xff 11111111
「 150 」と「 105 」のそれぞれのビット列が、「 OR 」演算によって無駄なく組み合わされて 1 バイトすべてにビットが立った値「 255 」が得られています。
数値として演算する その 2
次の演算も、双方を 10 進数の整数として演算するので、結果として「 255 」が得られます。
print '150' | 105, "\n";
次の演算も同様です。
print 150 | '105', "\n";
なぜなら、前回 (
0x221) で確認した通り、また、書籍「
初めての Perl 第 6 版 」の P.265 にある通り、どちらか一方のオペランドが整数の場合、Perl はそれを整数として演算子するからです。
ASCII based のビットとして演算する
ASCII ベースの文字列としてビット演算をする場合は次のようにクォーテーションを使います。
print '150' | '105', "\n";
これは、次の結果が得られます。
155
これは、「 150 」と「 105 」のそれぞれの桁の数字を次のように ASCII コードに変換してから「 OR 」ビット演算することから得られる結果です。
[150]
1 0x31 00110001
5 0x35 00110101
0 0x30 00110000
[105]
1 0x31 00110001
0 0x30 00110000
5 0x35 00110101
演算の内訳は次のようになっています。
1 0x31 00110001
OR 1 0x31 00110001
------------------
1 0x31 00110001
5 0x35 00110101
OR 0 0x30 00110000
------------------
5 0x35 00110101
0 0x30 00110000
OR 5 0x35 00110101
------------------
5 0x35 00110101
演算の型を明示的に指定する
Perl のビット演算では、プレフィクス「 0+ 」とダブルクォート「 " 」を利用することで、数値のビット列または ASCII ベースのビット列で演算することを明示することが出来ます。
例えば、次のように値を変数に格納してみます。
my $foo = 150;
my $bar = 105;
これに対して次のように演算を行います。
print 0+$foo | 0+$bar, "\n";
print "$foo" | "$bar", "\n";
すると、結果として次の値が得られます。
255
155
「 0+ 」を付けた方は数値としてビット演算されるので「 255 」が、ダブルクォート「 " 」で囲んだ方は ASCII ベースの文字列としてビット演算されるので「 155 」が得られています。
0x222 -> 0x223 へ
次回からは、「 ディレクトリの操作 」を確認します。
参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index