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);
}