Seasons.NET

ちょっとした技術ブログです

ビット演算の教え方

昨日の日記で葵やんからどうやって教えたのか?
というお問い合わせを頂いたので、簡単に説明したいと思います。

尚、テキストで書くことでシンプルに表現できるので
あえてテキストのみで説明します。

まず、ビット演算には、4つあります。
|論理和
&論理積
排他的論理和
〜反転


この4つのうちよく使うのは、
論理和、積でしょう。

というわけでまず教え方。

論理和と積というのは、まさに名前の通り、ビット同士の足し算とかけ。
つまり、

0000 0101 = 5
0000 0011 = 3
というビットがあった時、
上と下のビットを足した結果が論理和。かけ算した結果が論理積です。
この場合、結果は、それぞれ以下のようになるでしょう。


論理和
0000 0101 = 5
0000 0011 = 3
______________
0000 0111 = 7


論理積
0000 0101 = 5
0000 0011 = 3
______________
0000 0001 = 1

結果を見てもらうとわかるのですが、
論理和のほうは、面白い事に特定のビットに対して、
ビットONにする行為を行うことができます。
でもビットをOFFにする行為は出来ません。
なぜなら足し算ですから、元々1の所を足して0にすることは出来ないのです。
(1と0だけの世界では。)



ということは、ビットをOFFにする行為があると便利なわけです。
そこで論理積を見てみると、かけ算を行うわけですから、
1x1 = 1以外は、全て0になります。
つまり元々1の所に1を掛けても1が残るという現象が発生します。

これは何を意味しているかというと、ビットを残しておきたいものを1にして
論理積を取ればちゃんとそのビットを保護することができるわけです。
当然それ以外のビットは、全部0になります。


ただ、これでは、ある特定のビットだけOFFにすることは難しいでしょう。
例えば、
0000 0010 => STATUS_A というビット定義があった時
0000 1010 => というビット情報から、STATUS_AのビットだけOFFにしたいのです。


このまま論理積をとっても、
0000 0010
0000 1010
____________
0000 0010
STATUS_Aのビットが残ったままで、


論理和をとったら
0000 0010
0000 1010
____________
0000 1010
逆にビットが増えてしまうという本末転倒な事態が起きるのです・・・


そこで、反転というビットの出番です。
反転は、名前の通りビットを反転します。


これを使って、STATUS_Aのビットを反転すると
0000 0010
_____________
1111 1101
というビットができあがります。
これを先ほどのビットに論理積を掛けてみると・・・
1111 1101
0000 1010
_____________
0000 1000
見事にSTATUS_Aのビットだけ外れました。


反転が行うのは1のビットを全て0にして、逆も行いますから、
STATUS_Aの持つ1のビットを0にしてそのほかが全て1になるのです。
論理積では、1同士は、1.それ以外は、0になりますから、論理積を使ったわけです。

反転って便利ですね。