ビットマスクとフラグ
ビットを設定、クリア、反転します。
「ビットマスクとフラグ」は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フィードバックを取得できます。ローカル設定は不要です。