トリッキーコードネット トップへ戻る   C/C++, Java, Perl, PHP, JavaScript, アルゴリズム, ショートコーディング, IOCCCコードの解説, 等々

サイト情報

トリッキーなコード

7行プログラミング

物凄いコード集

アルゴリズム

データ構造

C/C++な話題

コードサンプル

ツール/環境構築

開発ノウハウ 等

ネタ/ジョーク集

おススメ書籍/サイト

サイトTOP >> トリッキーなコード >> コピペで即使えるbit演算マクロ (C言語)

コピペで即使えそうな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;
}
結果) 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秒以内に早押しで答えちゃってください ( ̄▽ ̄) ニヤリ (でも、こんなおもちゃの暗号でも、プログラミング素人さん達には、それなりに有効だったりしますが・・・) 【追記】 「分からないので答えを載せてください」というメールを頂きました。 正解を↓に載せておくので、反転して見て下さい^^;)
答えは ^ (XOR演算子) です。
         このエントリーをはてなブックマークに追加   


作業効率化・ライフハックのオススメ記事




コンピュータ・テクノロジーのオススメ記事





恋愛・人間関係のオススメ記事




※ 当サイトは、トップページからリンクで辿る事の出来るページに限り、リンクフリーです。
※ 当サイトの閲覧/利用によって生じた如何なる損害も、当サイト管理人は責任を負いません。
※ 当サイトの内容を転載される場合は、当サイトへのリンクをお願い致します。