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) 도 참일 경우이다
}
⚠️ **GitHub.com Fallback** ⚠️