본문 바로가기
임베디드 개발/펌웨어

비트 마스크 기법 , 원하는 비트만 조작하기

by eteo 2022. 5. 21.

 

 

비트 마스크 기법은 정수의 이진수 표현을 자료구조로 쓰는 기법을 말합니다.

 

아래 숫자를 초기상태로 사용해 예제를 진행해 보겠습니다. 최하위비트는 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)