今までの演算は普通の数学的な演算子しか行ってきませんでした。しかし、今回から数回にかけては少し特殊な演算を行ってみます。
今回の要点です。
では、いってみましょう。
前回n進数についての話をしました。そして、コンピューターは2進数を使って動いているという話もしました。今回からは、この2進数をベースにした演算を行います。
それはビット演算と呼ばれ、AND、OR、XOR、NOT、そしてビットシフトの5種類があります。何か難しい響きがしますが、その実体は非常に簡単なものです。では、今回から少しずつそのビット演算を体験してみましょう。
で、先ず初めに注意です。NOTは例外として、ビット演算子は+や−よりも優先順位が低いです。なので、
1 + 5 & 1
のように書くと、先ず 1 + 5 = 6 が行われ、そのあと 6 & 1 が行われます。何か不思議な感じがしますが、こういうものなので仕方がありません。このビット演算子の優先順位によるバグはかなり多いようで、筆者も注意していてもやってしまうことがあります。
ビット演算子を使うときは、とりあえず手当たり次第カッコを付けておくのが無難かと思います。
先ずは、AND(論理積)です。C/C++言語の演算子は & で、2つの数値から、1つの演算結果を導き出します。この辺は+とか−とかと同じですね。計算方法より、先ずは計算例を見てみましょう。(数値は2進数です。)
0011 &)0101 ―――――― 0001
つまり、両方ともビットが1のところは1、それ以外は0になります。これがANDです。
青が0、赤が1とすると、こんな感じになります。
& | = |
ビット演算は論理演算が基本になっています。論理演算とは、その言葉の通り真と偽という論理を演算するものです。条件文での && や || などがそうです。ANDは丁度条件文の && と似ています(同じではありません!)。1を真、0を偽に見立ててビットごとにANDをとっていくのが、このANDという演算なのです。
さて、次はANDの利用法について話しましょう。
先ずは、下の計算を見て下さい。
01111010 &)00001111 ―――――――――― 00001010
この計算をA&B=Cとおきます。これを見れば分かるとおり、Bで0であるビットはCでも全て0になっています。そして、Bで1であるビットはAのものがそのままCに現れています。つまり、Aの上位4ビットが0にされた、もしくはAの下位4ビットが取り出されたということになります。
つまり、取り出したいところのビットを1にした値を使えば、ANDをとることによって特定のビットを取り出すことができるのです。これは逆に言えば、消したいところのビットを0にした値を使えば特定のビットを消せる、ということになります。
いらないビットを0にして注目したいビットを取り出すというこの操作をマスキングとも呼びます。ANDはもっぱらこのマスキングに使われます。
今回はこれで終わりです。では、最後に要点を。
次回はORとXORについて話します。それでは。
第45章 2進数と16進数 | 第47章 ビットでいじろう2
Last update was done on 2000.1.18
この講座の著作権はロベールが保有しています