0Pricing
C Academy · レッスン

ビットマスクとフラグ

ビットを設定、クリア、反転します。

「ビットマスクとフラグ」はCoddyKit上の無料C Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。

フラグとしてのビット

1つの整数に、多数のオン/オフ設定をビットごとに格納できます。それぞれのビットがフラグです。

これはコンパクトで高速な方法であり、オペレーティングシステムや組み込みコードでよく使われます。

#include <stdio.h>

int main(void) {
    unsigned flags = 0;
    printf("Initial flags = %u\n", flags);
    return 0;
}

マスクの定義

マスクとは、特定のビットがセットされた値です。各フラグを2の累乗として定義すると、それぞれが専用のビットを使用します。

#include <stdio.h>

#define READ  (1u << 0)
#define WRITE (1u << 1)
#define EXEC  (1u << 2)

int main(void) {
    printf("READ=%u WRITE=%u EXEC=%u\n", READ, WRITE, EXEC);
    return 0;
}

ビットをセットする

フラグをオンにするには、値とマスクのORを取ります。flags |= MASKのように記述します。

すでにセットされているビットはセットされたままです。

#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)

int main(void) {
    unsigned flags = 0;
    flags |= READ;
    flags |= WRITE;
    printf("flags = %u\n", flags);
    return 0;
}

ビットをクリアする

フラグをオフにするには、反転したマスクとのANDを取ります。flags &= ~MASKのように記述します。

反転したマスクでは、対象ビットが0になり、それ以外のすべてのビットが1になります。

#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)

int main(void) {
    unsigned flags = READ | WRITE;
    flags &= ~WRITE;
    printf("flags = %u\n", flags);
    return 0;
}

ビットを反転する

フラグを反転するには、マスクとのXORを取ります。flags ^= MASKのように記述します。

オンの場合はオフになり、オフの場合はオンになります。

#include <stdio.h>
#define EXEC (1u << 2)

int main(void) {
    unsigned flags = 0;
    flags ^= EXEC;
    printf("after toggle: %u\n", flags);
    flags ^= EXEC;
    printf("after toggle: %u\n", flags);
    return 0;
}

ビットを確認する

フラグがオンかどうかを確認するには、マスクとのANDを取り、結果を調べます。セットされている場合、flags & MASKは0以外になります。

#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)

int main(void) {
    unsigned flags = READ;
    if (flags & READ)  printf("READ is on\n");
    if (flags & WRITE) printf("WRITE is on\n");
    else printf("WRITE is off\n");
    return 0;
}

複数のフラグをセットする

複数のフラグを一度にセットするには、マスクをORで組み合わせます。

#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
#define EXEC (1u << 2)

int main(void) {
    unsigned flags = READ | WRITE | EXEC;
    printf("all set: %u\n", flags);
    return 0;
}

複数のビットを一度に確認する

グループ内のすべてのビットがセットされていることを確認するには、結合したマスクとのANDを取り、その結果をマスク自体と比較します。

#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)

int main(void) {
    unsigned flags = READ | WRITE;
    unsigned need = READ | WRITE;
    if ((flags & need) == need) printf("both present\n");
    return 0;
}

有効なフラグを表示する

マスクを順番に処理して、現在オンになっているフラグを報告します。

#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
#define EXEC (1u << 2)

int main(void) {
    unsigned flags = READ | EXEC;
    if (flags & READ)  printf("R");
    if (flags & WRITE) printf("W");
    if (flags & EXEC)  printf("X");
    printf("\n");
    return 0;
}

セットされたビットを数える

オンになっているフラグの数を知るには、最下位のセットビットを繰り返しクリアして、セットされたビットを数えます。

#include <stdio.h>

int main(void) {
    unsigned v = 0b10110;
    int count = 0;
    while (v) {
        v &= (v - 1);
        count++;
    }
    printf("set bits = %d\n", count);
    return 0;
}

フラグ用の列挙型

enumを使用すると、フラグの定義を整理して読みやすくできます。

#include <stdio.h>

enum { OPT_A = 1, OPT_B = 2, OPT_C = 4 };

int main(void) {
    unsigned opts = OPT_A | OPT_C;
    printf("opts = %u\n", opts);
    if (opts & OPT_C) printf("C enabled\n");
    return 0;
}

理解度チェック

マスクとフラグについての知識を確認しましょう。

まとめ

ビットフラグの管理方法を学びました。

  • flags |= MASKでセットします。
  • flags &= ~MASKでクリアします。
  • flags ^= MASKで反転します。
  • flags & MASKで確認します。
  • マスクは2の累乗として定義します。多くの場合、マクロや列挙型を使用します。

よくある質問

「ビットマスクとフラグ」レッスンは無料ですか?

はい。「ビットマスクとフラグ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。

「ビットマスクとフラグ」で何を学びますか?

ビットを設定、クリア、反転します。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「ビットマスクとフラグ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC Academyレッスンでコードを書いて実行できますか?

はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ビット演算子
  2. シフト
  3. ビットマスクとフラグ
  4. 実践的なビット技巧
← C Academyに戻る