論理演算子とビット演算子

Javaでふとこんなコードを見た。

if(condition1 | condition2){
  //...
}

えーと、あーと、あれ、

| と ||
& と &&

って何が違うんだったっけ?
。。。
脳が劣化してきたのだろうか。。。やばい。ということでメモ。

  • ||や&&は論理演算子条件のAND、ORに使います。
  • |や&はビット演算子ビット演算のAND、ORに使います。
  • 上の2つの違いは、その名のとおり、条件(boolean)の結合に使うか、演算に使うかという違いです。ビット演算はbooleanの他に整数で利用します(例 int a = 1<<1 & 1<<2)。
  • if文の条件には動作上はどちらを書いてもほぼ同じですが、意味的には、if文に書くのは普通、論理演算子の方(|| &&)です。
  • また論理演算子では、処理の効率化のため、先の条件のチェックによって、後ろの条件のチェックが不要な場合には、チェックされません(例えば、confition1 && conditon2 でconditon1がfalaseならcondition2に関わらずfalseなのでcondition2は読み込まれない)。一方ビット演算子は、演算のためのものなので、こういう処理の省略はありません。
  • 普通のプログラマーがよく利用するのは論理演算子だと思うんですが、利用頻度の少ないビット演算子の方が「一文字少ないのでタイピングが楽」なのは、世の中そういうもんです。
  • 演算子の優先順序的には、論理演算子 > 条件演算子 です。でもまぁ、並べて書くとわけわからんことになるので、()で普通囲むでしょう。