TOP >> マニアックなプログラミング
トリッキーコードネット トリッキーなコード

【トリッキーなコード】コピペで使えるbit演算マクロ (C言語)

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; }
結果) C言語bit処理マクロの結果 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秒以内に早押しで答えちゃってください ( ̄▽ ̄) ニヤリ (でも、こんなおもちゃの暗号でも、プログラミング素人さん達には、それなりに有効だったりしますが・・・)
トリッキーコードネット の TOPへ HOTNEWS の 総合TOPへ