[C言語入門] 演算子の使い方(13)
高木です。おはようございます。
ちょっと間があいてしまいましたが、連載は自然消滅していませんよ。
演算子の使い方だけは最後まで書き切ります。
そんなわけで、前回は等価演算子でしたので、今回からビット単位の演算子の解説に入ります。
ひとつひとつの解説は長くないので、今回はビット単位のAND演算子、ビット単位の排他OR演算子、ビット単位のOR演算子を一気に解説します。
ビット単位のAND演算子
ビット単位のAND演算子は、整数値を構成する各ビットについてANDすなわち論理積を求めるための演算子で、1個の&を使用します。
&&のように&を2個連続して記述した場合は、後述する論理AND演算子になりますので要注意です。
<iso646.h>ヘッダではbitand
というマクロが定義されていますが、これもビット単位のAND演算子を意味します。
ビット単位のAND演算子のオペランドは、両方とも整数型でなければなりません。
式を評価するにあたり、まずは両方のオペランドに対して「通常の算術型変換」を行います。
「通常の算術型変換」についてはこれまでにも何度も出てきましたので、そちらを参照してください。
AND演算すなわち論理積というのは、2つのビットが両方とも1の場合に結果が1になります。
それ以外は結果が0になります。
この演算を、16ビットなら16ビット、32ビットなら32ビットについて、それぞれのビットに対して行うのです。
整数値を構成するビットパターンに対して、そのまま単純にビット単位のAND演算を行いますので、符合付き整数型の場合は思わぬ結果になることがあります。
とくに整数拡張にとってint型になる可能性があるunsigend char型などは、元の型が符合無しであっても符合付き整数として演算が行われる可能性があるので要注意です。
符合付き整数型に対するビット単位のAND演算は、負の整数値の内部表現が処理系定義ですので、評価結果も当然、処理系定義になります。
ビット単位の排他OR演算子
ビット単位の排他OR演算子は、整数値が構成する各ビットについて排他ORすなわち排他的論理和(exclusive or)を求めるための演算子で、^を使用します。
<iso646.h>ヘッダではxor
というマクロが定義されていますが、これもビット単位の排他OR演算子を意味します。
ビット単位の排他OR演算子のオペランドは、両方とも整数型でなければなりません。
式を評価するにあたり、まずは両方のオペランドに対して「通常の算術型変換」を行います。
排他OR演算すなわち排他的論理和というのは、2つのビットが異なる値の場合に結果が1になります。
それ以外は結果が0になります。
ビット単位のAND演算子同様、オペランドが符合付き整数型の場合の結果は処理系定義で、思わぬ結果になることがありますので要注意です。
また、処理系によっては、ビット単位の排他ORの結果、「トラップ表現」になってしまう可能性があります。
「トラップ表現」については、「演算子の使い方(10)」で解説しました。
ビット単位のOR演算子
ビット単位のOR演算子は、整数値を構成する各ビットについてORすなわち論理和を求めるための演算子で、1個の|を使用します。
||のように|を2個連続して記述した場合は、後述する論理OR演算子になりますので要注意です。
<iso646.h>ヘッダではbitor
というマクロが定義されていますが、これもビット単位のOR演算子を意味します。
ビット単位のOR演算子のオペランドは、両方とも整数型でなければなりません。
式を評価するにあたり、まずは両方のオペランドに対して「通常の算術型変換」を行います。
OR演算すなわち論理和というのは、2つのビットのうちのどちらか一方でも1であれば結果が1になります。
それ以外は結果が0になります。
ビット単位のAND演算子同様、オペランドが符合付き整数型の場合の結果は処理系定義で、思わぬ結果になることがありますので要注意です。
また、処理系によっては、ビット単位のORの結果、「トラップ表現」になってしまう可能性があります。
後半コピペが多くなりましたが、以上でビット単位の演算子についての解説は終わりです。
次回は論理演算子の解説になります。