bit演算は、メモリも節約できるし、何より処理が高速 な為、ここぞという時に威力を発揮してくれますよね♪
Cプログラマーならば是非とも身につけたい技の一つです。
というわけで、bit演算に役立つマクロを カキカキ _φ(* ̄0 ̄)ノ
#define bitcheck(a,b) (a >> b) & 1
#define bitset(a,b) a |= (1 << b)
#define bitunset(a,b) a &= ~(1 << b)
それぞれのマクロの意味は、マクロ名を見れば分かると思うので省略w
(ついでにこのマクロ、多分そのままコピペして、流用できるんじゃないかな~~?? と思います)
Cコード例)
#include <stdio.h>
#define bitcheck(a,b) (a >> b) & 1
#define bitset(a,b) a |= (1 << b)
#define bitunset(a,b) a &= ~(1 << b)
int main(void)
{
int i, check, maxbit;
maxbit = sizeof(int) * 8 - 1;
check = 1234567890;
for (i = maxbit; i >= 0; i--) {
printf("%d", bitcheck(check, i));
}
printf("\n");
bitset(check, 3);
bitset(check, 10);
for (i = maxbit; i >= 0; i--) {
printf("%d", bitcheck(check, i));
}
printf("\n");
bitunset(check, 1);
bitunset(check, 4);
for (i = maxbit; i >= 0; i--) {
printf("%d", bitcheck(check, i));
}
printf("\n");
return 0;
}
結果)
1と0が並んでいて目が痛くなりそうですが、ちゃんと動作しています。
さてさて、ところで初心者用のプログラミング教本には、
よくこんな感じの問題が出題されるそうです。
問:
部屋が8つあるホテルがある。
どの部屋に客が泊まっていて、どの部屋が空いているのかを管理するプログラムを作成しなさい。
プログラムに必要な機能は以下の3つである。
・検索機能 - 部屋番号を入力すると、その部屋の空き状況を、○×で表示する。
・宿泊機能 - どこかの部屋が空いている場合、そこに新しい客を泊まらせ、空き状況データを更新する。
・退出機能 - 泊まっていた客が退出する場合、該当する部屋の空き状況データを更新する。
ただし、8つの部屋の空き状況データを管理するメモリのサイズは、1byte以内に収めること。
もう既にお分かりでしょうが、上で紹介したbit演算マクロを使用すれば、楽勝~~ですね^^;)
後は、bit演算に関する問題として、こんなのが定番です。
問:
以下のソースコードは、平文(暗号化されていない文字列)を入力したら、暗号文を表示し、
暗号文を入力したら、元の平文を表示するものである。
ソースコード中の□に当てはまる記号を答えなさい。
char * angouka_or_hukugou(char * str, int key)
{
int i = 0;
while(str[i]) {
str[i++] □ key; // ← この □ に入る記号を答えよ
}
return str;
}
int main(void)
{
int key = 9; // ← 暗号化/復号の際に使うキー(これも入力する様にしたらなお良い)
char str[10] = "";
puts("暗号化/復号する文字列を入力して下さい。 ->");
fgets(str, 10, stdin);
puts( angouka_or_hukugou(str, key) );
return 0;
}
ま~お子ちゃまの暗号遊びですね^^;)
bit演算子の特徴を理解していたら、一瞬で解けてしまう問題です。
正解はあえて載せませんので、15秒以内に早押しで答えちゃってください ( ̄▽ ̄) ニヤリ
(でも、こんなおもちゃの暗号でも、プログラミング素人さん達には、それなりに有効だったりしますが・・・)