第47章 ビットでいじろう2

 今回も前回の続き、ビット演算について話します。今回はそのうちの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

この講座の著作権はロベールが保有しています