今回も前回の続き、ビット演算について話します。今回はそのうちのORとXORについて話したいと思います。
今回の要点です。
では、いってみましょう。
早速OR(論理和)についての話に入りましょう。C/C++言語の演算子は | で、2つの数値から、1つの演算結果を導き出します。先ずは計算例を見てみましょう。(数値は2進数です。)
0011 |)0101 ―――――― 0111
つまり、どちらかが1のところは1、それ以外は0になります。これがORです。
青が0、赤が1とすると、こんな感じになります。
| | = |
前回言ったとおり、ビット演算は論理演算を基本としています。ORは「もしくは」という言葉の意味を考えれば、その演算方法も簡単に覚えることができるでしょう。
さて、次はORの利用法について話しましょう。
先ずは、下の計算を見て下さい。
01111010 |)00001111 ―――――――――― 01111111
この計算をA&B=Cとおきます。これを見れば分かるとおり、Bで1であるビットはCでも全て1になっています。そして、Bで0であるビットはAのものがそのままCに現れています。つまり、Aの下位4ビットが1にされたということになります。
つまり、1にしたいところのビットを1にした値を使えば、ORをとることによって特定のビットを1にすることができるのです。これは2つの値を合成できるとも言い換えられます。ORはもっぱらこのビット合成に使われます。
ANDとORを使うと、ビット単位で0と1の変換、そして判定ができます。これはビット演算の中でも最も重要な部分なので、これについては後の章で詳しく話すことにします。
次はXOR(排他的論理和)です。C/C++言語の演算子は ^ で、2つの数値から、1つの演算結果を導き出します。^ はBASICでは累乗の演算子なので、BASICからCに入った人は混乱しないように注意です。で、どんなところが「排他的」なのか気になる名前ですが、それはともかく先ずは計算例を見てみましょう。(数値は2進数です。)
0011 ^)0101 ―――――― 0110
つまり、両方のビットが同じところは0、異なるところは1になります。これがXORです。
青が0、赤が1とすると、こんな感じになります。
^ | = |
「排他的論理和」の「排他的」というのは、この図を見ればわかるでしょう。ORのうち、ANDの部分を「排他」しているわけです。まぁ何はともかく、同じだと消えるということを覚えておいて下さい。
さて、次はXORの利用法について話しましょう。
先ずは、下の計算を見て下さい。
01111010 ^)00001111 ―――――――――― 01110101
この計算をやはりA&B=Cとおきます。これを見れば分かるとおり、Bで1であるビットはCではAの逆になっています。そして、Bで0であるビットはAのものがそのままCに現れています。つまり、Aの下位4ビットの0と1が反転したということになります。
つまり、反転したいところのビットを1にした値を使えば、XORをとることによって特定のビットを反転することができるのです。XORはもっぱらこのビット反転に使われます。
たとえば、2人用のゲームでプレイヤーの反転を行うときなどがいい例です。先ずプレイヤーを fPlayer という変数で表し、0を1P、1を2Pとします。するとプレイヤーの反転は
fPlayer ^= 1;
でできるわけです。これは結果だけを見れば
fPlayer = 1 - fPlayer;
と同じですが、XORを使った方が効率的です。
今回はこれで終わりです。では今回の要点です。
次回はNOTとビットシフトについて話します。それでは。
第46章 ビットでいじろう | 第48章 ビットでいじろう3
Last update was done on 2000.1.18
この講座の著作権はロベールが保有しています