トップC言語入門 > ビット単位のAND/OR演算

ビット単位のAND/OR演算

1.ビット単位のAND演算と論理積(Logical And)の違い

論理AND (a && b) では、a がゼロ(偽)ならば、b の評価(実行)はしない。 しかし、ビットAND (a & b) では、a がゼロであっても、必ず a & b の計算を行う。

例えば、次のプログラムでは、最初に a の値が 0 であるから、 a++ & b++ の結果が 0 であることは決定するが、b++ の計算も行う。

int main() {
    int a = 0, b = 0;

    if (a++ & b++) printf("nonzero a=%d, b=%d\n", a, b);
    printf("a=%d, b=%d\n", a, b);
}

したがって、結果は次のようになる。

c:\mh\www\c01\and_or>and01
a=1, b=1

何故、ビットAND演算と論理AND演算で扱いが変わるのであろうか? ビット演算では、ゼロは例外的であり、 大抵の場合、全計算が必要となるが、それが理由ではないだろう。

乗算 a * b でも、a が 0 であっても計算をする。 論理AND演算の方が例外である。

論理AND演算は、次のように、配列添え字の有効範囲を前でチェックする ときなどで使われる。 このような使い方ができるように仕様が決められたものと推測される。

for (n = 0; n < NMAX && isalpha(data[n]); n++) { ... }

2.ビット単位のOR演算と論理和(Logical Or)の違い

AND演算と同様の違いがある。 論理和では、条件が成立すれば、後続の論理和計算は行わない。 ビットOR演算では、ビットがオール1でも、後続のOR演算を実行する。