第49章 ビット単位の演算


今回は、ビット単位の演算をします。早い話が第40章の続きです。 まず、ビット単位でのand, or, exclusive orについて理解しましょう。

& (and)ともに1なら1 ^ (xor)互いに異なるとき1 | (or) 1を含めば1

うーん、これじゃわからん!

はい。まず、andとorを覚えましょう。andは「かつ」、orは「または」です。 「かつ」というのはどちらも真の時のみ真となります。1を真、0を偽と考えると わかりやすいですね。「猫は、動物である」かつ「犬は、昆虫である」という命題は 前半は正しいですが、後半は間違っています。従って、全体としては偽です。 しかし、「猫は、動物である」または「犬は、昆虫である」は前半があっているので 全体としては真です。こういう説明は、論理演算の説明でビット演算の説明に 使うのは間違っていますが、結果的には同じことで「かつ」わかりやすいですね。 xorは、特殊なもので互いに異なる時のみ真と覚えればよいでしょう。

ビット演算 10進数 (1010)&(1001)=(1000)・・・10 & 9 = 8 (1010)^(1001)=(0011)・・・10 ^ 9 = 3 (1010)|(1001)=(1011)・・・10 | 9 = 11

ビット演算の所と10進数の所をよく見て下さい。 上の計算の意味がわかったでしょうか?

では、上の計算が正しいかどうか実際にプログラムを書いてみましょう。

10進数で10は2進数では、1010です。
10進数で9は2進数では、1001です。
これらの、ビット演算(&,^,|)を行っています。

どうでしょうか。ビット演算の意味がおわかりいただけたでしょうか。

「計算の方法はわかったが、こんなもの何の役に立つのだ!?」

と、思っているあなた!これが結構重宝するのです。 簡単な例をプログラムで示しましょう。

#include <stdio.h> void get_animal(int); int dog = 1, cat = 2, rat = 4, rabbit = 8; int c[4]; int main(void) { printf("dog => "); get_animal(dog); printf("cat => "); get_animal(cat); printf("rat => "); get_animal(rat); printf("rabbit => "); get_animal(rabbit); printf("dog | cat => "); get_animal(dog | cat); printf("dog | cat | rabbit => "); get_animal(dog | cat | rabbit); return 0; } void get_animal(int x) { int i; for (i = 0; i <= 3; i++) { c[i] = x % 2; x /= 2; printf("c[%d] = %d, ", i, c[i]); } printf("\n"); return; }

上のプログラムを実行すると・・・

c[0]が1なら犬、c[1]が1なら猫、c[2]が1ならラット、 c[3]が1ならウサギを表しています。複数の動物を表したいならば orで結んでいけばいいのです。

もう少し説明すると、dog = 1ですから、これを 2進数で表すと0001、cat = 2は0010、 rat = 4は0100、rabbit = 8は1000と なります。それぞれのビットが犬、猫、ラット、 ウサギを表すと思えばいいですね。 そして、複数の動物を表したいときは cat | dog のようにすれば、それぞれのビットに 1が入ります。

get_animal関数では、引数xを2進数に直して、 逆向きに表示しています。

0001ならば、c[0]=1,c[1]=0,c[2]=0,c[3]=0 という具合です。

こういう使い方は、WindowsのAPI関数でよく出てきます。


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Jan/31/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。