1ビットだけ反転させるサンプル。
このサンプルでは、FRAMING_ERROR定数のビット(0000 0010)をオフにする。
オフにするには、FRAMING_ERRORを反転させて対象となるデータ(targetData=0x0f)を
論理積(&, and)で演算する。

#include <stdio.h>

#define CLEAR            0
#define ERROR             1 << 0 // 0x01
#define FRAMING_ERROR        1 << 1 // 0x02
#define PARITY_ERROR        1 << 2 // 0x04
#define CARRIER_LOST        1 << 3 // 0x08
#define CHANNEL_DOWN        1 << 4 //  0001 0000

/* prototype */
void onFlagOff();

int main(int argc, char *argv[]) {
    char flag = CLEAR;
    flag |= ERROR;
    
    switch (flag) {
        case ERROR:
            break;
        case FRAMING_ERROR:
            break;
        case PARITY_ERROR:
            break;
        case CARRIER_LOST:
            break;
        case CHANNEL_DOWN:
            break;
        default:
            break;
    }
    printf("flag:%d\n", flag);

    /* all flag on */
    flag = CLEAR;
    flag |= ERROR;
    flag |= FRAMING_ERROR;
    flag |= PARITY_ERROR;
    flag |= CARRIER_LOST;
    flag |= CHANNEL_DOWN;

    /* 0001 1111 */
    printf("%d\n", flag);
    // 1111 1111 (1 << 7)
    // 1110 1111 (~CHANNEL_DOWN) &
    // -------------
    // 1110 1111
    // 0001 1111 (target value) &
    // -------------
    // 0000 1111
    onFlagOff();

    return 0;
}

void onFlagOff() {
    unsigned char targetData = 0x0f;         // 0000 1111
    unsigned char result = 0;
    printf("targetData=%d\n", targetData);
    printf("result=%d\n", result);

    // 1111 1101(~ERROR)
    // 0000 1111 &
    // ---------
    // 0000 1101
    result = (~FRAMING_ERROR) & targetData;
    printf("%d\n", (~FRAMING_ERROR));
    printf("result=%d\n", result);
}