| sets a bit and & with an inverted mask clears a bit.

set bit `value | mask` turns on the bits named by the mask.
clear bit `value & ~mask` turns off the bits named by the mask.

Set And Clear Bits

flags
set_clear_bits.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

int main(void) {
    int flags = 1;
    flags = flags | 2;
    flags = flags & ~1;

    printf("flags=%d\n", flags);
    return 0;
}
#include <stdio.h>

int main(void) {
    int flags = 0;
    flags = flags | 2;
    flags = flags & ~1;

    printf("flags=%d\n", flags);
    return 0;
}
#include <stdio.h>

int main(void) {
    int flags = 7;
    flags = flags | 2;
    flags = flags & ~1;

    printf("flags=%d\n", flags);
    return 0;
}
  1. flags ← 1

    3int main(void) {4    int flags→ 1 = 1; //@flags=0, 75    flags→ 3 = flags | 2;6    flags→ 2 = flags & ~1;78    printf("flags=%d\n", flags2);9    return 0;10}
    outputflags=2
  1. flags ← 0

    3int main(void) {4    int flags→ 0 = 0;5    flags→ 2 = flags | 2;6    flags2 = flags & ~1;78    printf("flags=%d\n", flags2);9    return 0;10}
    outputflags=2
  1. flags ← 7

    3int main(void) {4    int flags→ 7 = 7;5    flags7 = flags | 2;6    flags→ 6 = flags & ~1;78    printf("flags=%d\n", flags6);9    return 0;10}
    outputflags=6