2013年7月7日日曜日

論理演算とビット演算

意識は高い後輩君がまた会社を辞めたようだ。思わず最近書いてなかったブログを記録として書いてしまった次第。
彼は前職の後輩で、技術情報は良く収集する勉強熱心な性格で、自分の技術を活かせる場所が見つからなかったのか。

以前、一緒に仕事をすることがあったが、そんな彼のコードはちょっと不思議。言語はPHPだったが、if文の条件式が、論理演算ではなくビット演算だったのだ。
なぜかと質問したら、「結果は同じでしょ?省略系です」といったようなことを言われ、下記のような結果を見せられた。。見せられたのではなく書かされたのだったかも。
<?php
for ($i = 0; $i <= 1; $i++) {
  for ($j = 0; $j <= 1; $j++) {
    echo "a=$i b=$j\n";
    logical_and($i, $j);
    bit_and($i, $j);
    logical_or($i, $j);
    bit_or($i, $j);
  }
}

function logical_and($a, $b) {
  echo "logical_and: ";
  if ($a && $b) {
    echo "true\n";
  } else {
    echo "false\n";
  }
}

function logical_or($a, $b) {
  echo "logical_or:  ";
  if ($a || $b) {
    echo "true\n";
  } else {
    echo "false\n";
  }
}

function bit_and($a, $b) {
  echo "bit_and:     ";
  if ($a & $b) {
    echo "true\n";
  } else {
    echo "false\n";
  }
}

function bit_or($a, $b) {
  echo "bit_or:      ";
  if ($a | $b) {
    echo "true\n";
  } else {
    echo "false\n";
  }
}

結果:
a=0 b=0
logical_and: false
bit_and:     false
logical_or:  false
bit_or:      false
a=0 b=1
logical_and: false
bit_and:     false
logical_or:  true
bit_or:      true
a=1 b=0
logical_and: false
bit_and:     false
logical_or:  true
bit_or:      true
a=1 b=1
logical_and: true
bit_and:     true
logical_or:  true
bit_or:      true
はい。結果は同じです。同じですけども。やはり彼の省略コードはまちがっている。
違いは式を評価するかしないか。論理積(AND)なら前式がFALSEなら、論理和(OR)なら前式がTRUEなら、後式は評価しない。当たり前のことだが、そもそも論理演算の代わりに、ビット演算を使おうなどと考えもしなかったので、一瞬騙されかけた。
<?php
false &  print "A:やっはろー\n";
false && print "B:やっはろー\n";
true  |  print "C:やっはろー\n";
true  || print "D:やっはろー\n";

結果:
A:やっはろー
C:やっはろー
お前が楽するために省略してどうするんだって話。CPUを楽させてやれと。まぁ、そんなことも昔の話、良い思い出。

新たな場所でのさらなる活躍に期待。