C 비트 플래그 - sonkoni/Koni-Wiki GitHub Wiki
== 마스크 만들기 ==
unsigned char maskHello = 1 << 0; // 0000 0001
unsigned char maskWorld = 1 << 0; // 0000 0100
== 마스크 할당 ==
flag |= mask;
flag = mask1 | mask2 | mask3;
== 마스크 활용 ==
(flag & mask) 형태로 검사
(flag ^= mask) 마스크 역전
(flag &= ~mask) 마스크 끄기
비트연산자는 플래그(flag)로 활용된다. 플래그는 스위치다. 깃발이 올라가 있으면 1, 내려가 있으면 0이다.
#include <stdio.h>
int main(int argc, char *argv[]) {
unsigned char option1 = 1 << 0; // 0000 0001 1번 올려
unsigned char option3 = 1 << 2; // 0000 0100 3번 올려
unsigned char flag = 0;
//
// (flag |= mask) 마스크 할당하기
//
flag |= option3; // 0000 0100
//
// (flag & mask) 형태로 검사하기
//
if (flag & option1) {
printf("첫번째: 옵션 1 켜짐\n");
}
if (flag & option3) {
printf("첫번째: 옵션 3 켜짐\n");
}
//
// (flag ^= mask) 마스크 역전시키기
//
flag ^= option1; // 옵션 1이 켜져 있으면 끄기 / 꺼져 있으면 켜기
flag ^= option3; // 옵션 3이 켜져 있으면 끄기 / 꺼져 있으면 켜기
// flag = 0000 0001
if (flag & option1) {
printf("두번째: 옵션 1 켜짐\n");
}
if (flag & option3) {
printf("두번째: 옵션 3 켜짐\n");
}
//
// (flag &= ~mask) 마스크 끄기
//
flag &= ~option1; // 옵션 1 무조건 끄기
flag &= ~option3; // 옵션 3 무조건 끄기
// flag = 0000 0000
if (!(flag & option1)) {
printf("세번째: 옵션 1 꺼졌음\n");
}
if (!(flag & option3)) {
printf("세번째: 옵션 3 꺼졌음\n");
}
return 0;
}
// 첫번째: 옵션 3 켜짐
// 두번째: 옵션 1 켜짐
// 세번째: 옵션 1 꺼졌음
// 세번째: 옵션 3 꺼졌음typedef NS_OPTIONS (NSInteger, MGRAlertOption) {
MGRAlertOptionNone = 0, // 0000 0000
MGRAlertOptionFade = 1 << 0, // 0000 0001
MGRAlertOptionSlideTop = 1 << 1, // 0000 0010
MGRAlertOptionSlideLeft = 1 << 2, // 0000 0100
MGRAlertOptionSlideBottom = 1 << 3, // 0000 1000
};---------------------------------------------------------------
~ 1의 보수 1과 0을 서로 바꿈 a : 1011 0110
~a : 0100 1001
---------------------------------------------------------------
& 비트 논리곱(AND) 둘다 1일 때만 1 a : 1011 0110
b : 1000 1101
a&b : 1000 0100
---------------------------------------------------------------
^ 비트 배타적 논리합(XOR) 하나만 1일 때만 1 a : 1011 0110
b : 1000 1101
a^b : 0011 1011
---------------------------------------------------------------
| 비트 포함 논리합(OR) 하나라도 1이면 1 a : 1011 0110
b : 1000 1101
a|b : 1011 1111
---------------------------------------------------------------
보통 비트스위치에서는 비트논리곱( & )이나 비트포함논리합( | )을 많이 사용한다.
비트연산자와 논리연산자( || && ! )를 결합해서 사용하기도 한다
if ((option1 & option2) && (option1 & option2) {
// 이 경우는 (option1 & option2) 가 참이고, (option1 & option2) 도 참일 경우이다
}