비트 마스크 기법은 정수의 이진수 표현을 자료구조로 쓰는 기법을 말합니다.
아래 숫자를 초기상태로 사용해 예제를 진행해 보겠습니다. 최하위비트는 0번이고 최상위비트는 15번이라고 지칭하겠습니다.
1. 특정 비트를 1로 만들기
|= 연산 사용. 내가 켜고 싶은 비트는 1 나머지는 0
15, 11, 7, 3번 비트 켜기
이전 상태와는 상관없이 다른 비트는 건들지 않고 내가 켜고 싶은 비트만 1로 만듭니다.
#include <stdio.h>
int main()
{
unsigned short num = 23130; // 0x5a5a
num |= 0x8888;
printf("0x%04x\n", num);
return 0;
}
결과
2. 특정 비트를 0으로 만들기
&= 연산 사용. 내가 끄고싶은 비트는 0 나머지는 1.
혹은 내가 끄고싶은 비트는 1로하고 나머지는 0으로 해서 ~( ) 비트반전 후 &= 연산한다.
12, 8, 4, 0번 비트 끄기
다른 비트는 건들지 않고 내가 끄고 싶은 비트만 0으로 만듭니다.
#include <stdio.h>
int main()
{
unsigned short num = 23130; // 0x5a5a
num &= ~(0x1111);
printf("0x%04x\n", num);
return 0;
}
결과
3. 비트가 0 이면 1 로, 1 이면 0 으로 토글시키는 방법
^= 연산 사용. 내가 토글시킬 비트는 1 나머지는 0
13, 9, 5, 1 번 비트 토글시키기
다른 비트는 건들지 않고 내가 토글시키고 싶은 비트만 토글합니다.
#include <stdio.h>
int main()
{
unsigned short num = 23130; // 0x5a5a
num ^= 0x2222;
printf("0x%04x\n", num);
return 0;
}
결과
4. 특정 비트 켜있는지 확인하기
확인대상을 >> 최하위 비트로 시프트 후 1과 & 연산
1은 0x0001과 마찬가지이기 때문에 & 연산하면 해당비트만 확인할 수 있다. 켜있으면 1을 반환, 꺼져있으면 0을 반환.
12번비트 켜있는지 확인하기
8번비트 켜있는지 확인하기
#include <stdio.h>
int main()
{
unsigned short num = 23130; // 0x5a5a
printf("0x%04x\n", (num >> 12) & 1);
printf("0x%04x\n", (num >> 8) & 1);
return 0;
}
결과
혹은 1을 해당비트 위치만큼 << 시프트 후 & 연산
#include <stdio.h>
int main()
{
unsigned short num = 23130; // 0x5a5a
printf("0x%04x\n", num & (1<<12));
printf("0x%04x\n", num & (1<<8));
return 0;
}
결과
이때는 0이 아닌 값이 나왔을 때 해당비트가 켜있다고 판단할 수 있다.
추가.
주어진 비트 수에 따라 해당 비트를 모두 1로 설정하는 마스크를 생성하는 매크로 함수
#define MAKE_MASK(num_bits) ((1 << (num_bits)) - 1)
'임베디드 개발 > 펌웨어' 카테고리의 다른 글
CISC 와 RISC (0) | 2022.06.23 |
---|---|
STM32 ] Datasheet 첫 장에 나오는 DMIPS 란 (0) | 2022.06.23 |
Memory mapped I/O 와 I/O mapped I/O (0) | 2022.06.23 |
STM32 ] __IO , volatile 타입 한정자 (Qualifier) (2) | 2022.06.23 |
GPIO output mode , Push-Pull 과 Open drain 의 차이 (0) | 2022.06.05 |