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은 켜져 있음