비트 연산자 플래그 처리하기

mtak·2021년 1월 27일
1

42Seoul

목록 보기
9/13

비트 연산자로 플래그 처리하기

8비트(1바이트) 크기의 자료형은 비트가 8개가 들어가므로 8가지 상태를 저장할 수 있다. 여기서는 두 번째 비트와 여덟 번째 비트가 켜진 상태.

0100 0001    // 두 번째 비트와 여덟 번째 비트가 켜진 상태(on)

int와 같은 4바이트 크기의 자료형은 4바이트는 32비트이므로 32개의 상태를 저장할 수 있다.

특정 비트를 켜는 방법

플래그 |= 마스크

플래그의 비트를 조작하거나 검사할 때 사용하는 숫자를 마스크(mask)라고 부른다.

#include <stdio.h>
 
int main()
{
    unsigned char flag = 0;
 
    flag |= 1;    // 0000 0001 마스크와 비트 OR로 여덟 번째 비트를 켬
    flag |= 2;    // 0000 0010 마스크와 비트 OR로 일곱 번째 비트를 켬
    flag |= 4;    // 0000 0100 마스크와 비트 OR로 여섯 번째 비트를 켬
 
    printf("%u\n", flag);    // 7: 0000 0111
 
    if (flag & 1)    // & 연산자로 0000 0001 비트가 켜져 있는지 확인
        printf("0000 0001은 켜져 있음\n");
    else
        printf("0000 0001은 꺼져 있음\n");
 
    if (flag & 2)    // & 연산자로 0000 0010 비트가 켜져 있는지 확인
        printf("0000 0010은 켜져 있음\n");
    else
        printf("0000 0010은 꺼져 있음\n");
 
    if (flag & 4)    // & 연산자로 0000 0100 비트가 켜져 있는지 확인
        printf("0000 0100은 켜져 있음\n");
    else
        printf("0000 0100은 꺼져 있음\n");
 
    return 0;
}
7
0000 0001은 켜져 있음
0000 0010은 켜져 있음
0000 0100은 켜져 있음
0000 0111
0000 0100 마스크
_________ &
0000 0100

플래그의 비트를 끄는 방법

플래그 &= ~마스크

#include <stdio.h>
 
int main()
{
    unsigned char flag = 7;    // 7: 0000 0111
 
    flag &= ~2;    // 1111 1101 마스크 값 2의 비트를 뒤집은 뒤 비트 AND로 일곱 번째 비트를 끔
 
    printf("%u\n", flag);    // 5: 0000 0101
 
    if (flag & 1)    // & 연산자로 0000 0001 비트가 켜져 있는지 확인
        printf("0000 0001은 켜져 있음\n");
    else
        printf("0000 0001은 꺼져 있음\n");
 
    if (flag & 2)    // & 연산자로 0000 0010 비트가 켜져 있는지 확인
        printf("0000 0010은 켜져 있음\n");
    else
        printf("0000 0010은 꺼져 있음\n");
 
    if (flag & 4)    // & 연산자로 0000 0100 비트가 켜져 있는지 확인
        printf("0000 0100은 켜져 있음\n");
    else
        printf("0000 0100은 꺼져 있음\n");
 
    return 0;
}
5
0000 0001은 켜져 있음
0000 0010은 꺼져 있음
0000 0100은 켜져 있음

비트가 켜져 있다면 끄고, 꺼져있다면 켜는 방법(toggle)

플래그 ^= 마스크

#include <stdio.h>
 
int main()
{
    unsigned char flag = 7;    // 7: 0000 0111
 
    flag ^= 2;    // 0000 0010 마스크와 비트 XOR로 일곱 번째 비트를 토글
    flag ^= 8;    // 0000 1000 마스크와 비트 XOR로 다섯 번째 비트를 토글
 
    printf("%u\n", flag);    // 13: 0000 1101
 
    if (flag & 1)    // & 연산자로 0000 0001 비트가 켜져 있는지 확인
        printf("0000 0001은 켜져 있음\n");
    else
        printf("0000 0001은 꺼져 있음\n");
 
    if (flag & 2)    // & 연산자로 0000 0010 비트가 켜져 있는지 확인
        printf("0000 0010은 켜져 있음\n");
    else
        printf("0000 0010은 꺼져 있음\n");
 
    if (flag & 4)    // & 연산자로 0000 0100 비트가 켜져 있는지 확인
        printf("0000 0100은 켜져 있음\n");
    else
        printf("0000 0100은 꺼져 있음\n");
 
    if (flag & 8)    // & 연산자로 0000 1000 비트가 켜져 있는지 확인
        printf("0000 1000은 켜져 있음\n");
    else
        printf("0000 1000은 꺼져 있음\n");
 
    return 0;
}
13
0000 0001은 켜져 있음
0000 0010은 꺼져 있음
0000 0100은 켜져 있음
0000 1000은 켜져 있음

profile
노는게 젤 조아. 친구들 모여라!!

0개의 댓글