Namaran

Code daily. Without assist.

2026-09-20

perm_flags.c

#include <stdio.h>

#define FLAG_READ  1u
#define FLAG_WRITE (1u << 1)
#define FLAG_EXEC  (1u << 2)

int main(void) {
    unsigned perm = FLAG_READ | FLAG_WRITE;
    perm ^= FLAG_WRITE;
    perm |= FLAG_EXEC;
    perm &= ~FLAG_READ;
    printf("%u\n", perm);
}

permはOR・XOR・AND-with-complementでフラグを更新しています。printfは何を出力するでしょうか?

Answer

4(その後に改行)。まずFLAG_READ | FLAG_WRITEperm1 | 2 = 3になります。perm ^= FLAG_WRITEは「すでに立っているビットをXORで反転する」形なので、FLAG_WRITEだけが降りて3 ^ 2 = 1になります。perm |= FLAG_EXECでそこに4が立って1 | 4 = 5。最後のperm &= ~FLAG_READは、FLAG_READのビットだけを0にしたマスク(~FLAG_READ)とのANDで、そのビットだけを降ろします。5FLAG_READFLAG_EXECが立った状態なので、FLAG_READを降ろすとFLAG_EXECだけが残り、4になります。OR(立てる)・XOR(反転する)・AND-with-complement(降ろす)という3つの基本操作を、フラグ用の定数をそのまま組み合わせて実現できることがこの例の要点です。