論理和
論理和は、ひらたく言えば2進数での足し算です。ただし、普通の足し算とちょっとだけ違うところがあります。小学一年生にもどって(?)、次の問題を解いてみてください。
1) 0+0= 2) 0+1= 3) 1+0= 4) 1+1=
1)は、もちろん0ですね。2)と3)は1です。では4)は? 2と答えた方、残念、これは2進数なので1か0しかありません。10と答えた方。惜しいです!
確かに普通の足し算では1+1は10です。しかし、論理和では1+1は1になります。実は論理和は英語ではORと表現されます。つまり、演算する2つの項のどちらか一方が1であれば、1というわけです。
上記の問題を、以下のように書き直すと納得しやすいでしょうか。
1) 0 or 0= 2) 0 or 1= 3) 1 or 0= 4) 1 or 1=
この演算は、実際のプログラムでは、主に特定のビットを1にしたいときに使います。たとえば図5のように、ある8ビットのポートPxに8個のLEDがつながっているとします。LEDは対応するビットが1になると光るよう回路設計されています。このとき、D3だけを点灯させたいときはどうすればいいでしょうか。

この場合、Pxのビット3(b3)を1にすればいいので、以下のようにすればOKです。
Px = 8; /* 8 は 0000 1000 */
しかし、すでに他のいくつかのLEDが点灯していたとしたらどうでしょう。たとえばD0が点灯していたとすると、上のプログラムを実行した瞬間に、Pxのビット0(b0)は0になってしまうので、消灯してしまうことになります。こんなときに論理和が役立ちます。C言語では、論理和は演算子に「|」を使って以下のように書きます。
Px = Px | 8 ; /* 8 は 0000 1000 */
これで、もともとのPxの値は保ったまま、b3だけを1にすることができます。もし、b3がもともと1であったとしても、1or 1 = 1ですから、なにも問題は起こりません。もしこれを普通の足し算を使って
Px = Px + 8 ;
と書くと、b3が0のときは正常動作しますが、b3が1の場合b4に桁上がりしてD4が点灯してしまうような異常動作(不具合)が発生していまいます。
