& (and)ともに1なら1 ^ (xor)互いに異なるとき1 | (or) 1を含めば1
ビット演算の所と10進数の所をよく見て下さい。 上の計算の意味がわかったでしょうか?ビット演算 10進数 (1010)&(1001)=(1000)・・・10 & 9 = 8 (1010)^(1001)=(0011)・・・10 ^ 9 = 3 (1010)|(1001)=(1011)・・・10 | 9 = 11
では、上の計算が正しいかどうか実際にプログラムを書いてみましょう。
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関数でよく出てきます。
Update Jan/31/1997 By Y.Kumei