2진수는 숫자를 표현할때 0과 1 두 가지 값으로만 표현합니다. 여기서 0과 1을 On / Off로 사용하는 개념을 비트 플래그라고 합니다. 이것을 어디에다 사용하냐?라고 반문하실 수도 있는데 전혀 사용성이 없는 것은 아니고 한 번에 여러 가지 속성을 동시에 지정할 때, 편리하게 사용할 수 있는 방법 중에 하나가 비트 플래그입니다.
비트 플래그를 사용하면 좀 더 공간을 효율적으로 사용할 수 있습니다. 단순 비교를 해보아도 8개의 상태를 저장하려면 bool 타입 변수 8개를 선언해야 할텐데 8비트의 char을 비트단위로 쪼개서 저장한다면 1개의 char 변수(1byte = 8bit)만으로도 8개의 상태를 저장할 수가 있죠.
비트 플래그 (Bit Flag) 사용 간단한 예제
#include <stdio.h>
int main() {
unsigned char num = 0;
int location = 0; // 비트 위치
int status = 0; // 비트 상태
for (;;) {
printf("변경할 비트 위치(0 ~ 7) : ");
scanf_s("%d", &location);
printf("[ 0 : OFF ] / [ 1: ON ] : ");
scanf_s("%d", &status);
if (status == 0) { // OFF
num &= ~(1 << location);
}
else if (status == 1) { // ON
num |= 1 << location;
}
//비트 출력
for (int i = 0; i < 8; i++) {
int temp = num >> i & 1;
printf("[%d] ", temp);
}
printf("\n\n");
}
}
위의 예제처럼 비트 연산자를 활용하여 비트를 0과 1로 바꿀 수 있습니다. 위와 같은 방식을 사용하여 TRUE / FALSE 값을 저장, 활용한다면 메모리를 보다 절약할 수 있겠죠. 상태값을 바꾸는 비트 연산이 이해를 안 가시는 분들을 위해 아래에 간단한 설명을 참고합니다. 출력 부분은 아래 글을 참고해주세요.
[C언어] 10진수를 2진수로 출력하기 (비트연산 활용)
특정 위치 비트 상태값 1로 바꾸기
특정 위치의 비트를 1로 바꾸는 방법은 위와 같습니다. 먼저 1을 << Shift연산을 통해 원하는 위치로 이동합니다. 예를 들어 2번째 위치의 비트를 변경시키려면 1 << 2 이렇게 해주시면 됩니다. 이렇게 Shift연산이 끝나면 00000100이 될 것입니다. 이를 OR 연산을 해주게 되면 상태 값이 1로 바뀌게 됩니다.
특정 위치 비트 상태값 0으로 바꾸기
특정 위치의 비트를 0으로 바꾸는 방법은 위와 같습니다. 역시 먼저 1을 << Shift연산을 통해 바꾸고 싶은 위치로 이동합니다. 그런뒤 ~ 연산을 통해 비트를 반전합니다. 비트를 반전하는 이유는 2가지가 있는데 Char형 비트 안에 1이 있다면 이후 & 연산을 통해 1로 유지시켜주기 위함과, 0으로 바꾸고 싶은 위치의 비트를 0으로 만들어주어 이후 AND연산을 통해 Char형의 비트를 0으로 만들어주기 위함입니다. 비트 반전이 끝났다면 & 연산을 통해 타겟 비트를 0으로 만들어줍시다.
'Language > C , C++ , C#' 카테고리의 다른 글
[C언어/C++] 포인터 배열, 배열 포인터의 사용법과 차이점 (3) | 2021.01.30 |
---|---|
[C언어/C++] 비트 쪼개기 (Bit Split) 사용법 & 예제 (비트연산 활용) (2) | 2021.01.29 |
[C언어/C++] 10진수를 2진수로 변환 출력하기 (비트연산 활용) (0) | 2021.01.28 |
[C언어/C++] 10진수를 8진수, 16진수로 출력하기 (0) | 2021.01.28 |