TITEDIOS Dev Note

C 기초강의: #9 비트마스킹 - 비트연산자의 활용 본문

C++

C 기초강의: #9 비트마스킹 - 비트연산자의 활용

TitediosKW 2024. 8. 17. 19:00
반응형


비트마스킹(Bit Masking)은 이진수(bit) 연산을 활용하여 데이터의 특정 비트를 조작하거나 추출하는 기법입니다. 주로 비트연산자와 함께 사용되며, 메모리 효율성과 성능을 높이기 위해 사용됩니다. 비트마스킹은 플래그 관리, 비트 조작, 하드웨어 제어 등 다양한 용도로 활용됩니다.


비트마스크란?

비트마스크는 특정 비트를 선택하거나 변경하는 데 사용되는 이진 숫자입니다. 이 비트마스크를 사용하여 특정 비트를 1로 설정하거나, 0으로 클리어하거나, 반전하는 등의 작업을 수행할 수 있습니다.

비트마스킹의 주요 연산

비트마스킹을 수행하는 대표적인 사례는 임베디드 프로그래밍입니다. 우리가 사용하는 가전 기기 등에는 독립적인 프로세서들이 있어 동작을 수행하는데요 이 프로세서들은 컴퓨터나 모바일의 프로세서처럼 성능이 대단하지 못합니다(그렇다면 가전은 훨씬 비쌌을 겁니다ㅠㅜ). 따라서 효율적으로 동작을 해야합니다. 이럴 경우에 비트마스크를 사용하여 적은 메모리로도 연산 등의 작업을 수행할 수 있도록 비트마스킹을 활용합니다.

비트 설정 (Set Bit)

특정 비트를 1로 설정하기 위해 비트 OR 연산자(|)와 함께 비트마스크를 사용합니다.

// #1
int num = 0b1010; // 10 in decimal
int mask = 0b0100; // 4 in decimal, target to set the 3rd bit 
num = num | mask;  // 결과: 0b1110 (14 in decimal)

// #2
int num = 0b1010; // 10 in decimal
num = num | (1<<2); // 한 줄 작성
// A = A | (1<<k);  // k 번째 비트를 1로 세팅

위 코드에서 mask의 비트 3이 1로 설정되어 있으므로, num의 비트 3도 1로 설정됩니다.

비트 클리어 (Clear Bit)

특정 비트를 0으로 설정하기 위해 비트 AND 연산자(&)와 비트 NOT 연산자(~)를 사용합니다.

// #1
int num = 0b1110; // 14 in decimal
int mask = 0b1011; // 11 in decimal, target to clear the 3rd bit
num = num & mask;  // 결과: 0b1010 (10 in decimal)

// #2
int num = 0b1110; // 14 in decimal
num = num & ~(1<<2);  // 한 줄 쓰기
// A = A & ~(1<<k);  // k 번째 비트를 클리어(0로 만듬)

이 예제에서 mask의 2번째 비트가 0이므로, num의 2번째 비트가 0으로 설정됩니다.

비트 토글 (Toggle Bit)

특정 비트를 반전시키기 위해 비트 XOR 연산자(^)를 사용합니다. 이 연산을 통해 0은 1로, 1은 0으로 반전됩니다.

// #1
int num = 0b1110; // 14 in decimal
int mask = 0b0100; // 4 in decimal, target to toggle the 3rd bit
num = num ^ mask;  // 결과: 0b1010 (10 in decimal)

// #2
int num = 0b1110; // 14 in decimal
num = num ^ (1<<2);
// A = A ^ (1<<k); // k 번째 비트를 토글함

여기서 mask의 3번째 비트가 1이므로, num의 3번째 비트가 반전됩니다.

비트 체크 (Check Bit)

특정 비트가 1인지 0인지 확인하기 위해 비트 AND 연산자(&)를 사용합니다.

// #1
int num = 0b1010; // 10 in decimal
int mask = 0b0010; // 2 in decimal, target to check the 2nd bit
int result = num & mask; // 결과: 0b0010 (2 in decimal)
bool isSet = result != 0; // true, 비트 2는 설정됨

// #2
int num = 0b1010; // 10 in decimal
bool isSet = (num & (1<<1)) != 0); // 한 줄 쓰기, true, 비트 2는 설정됨
// (num & (1<<k)): k 번째 비트를 확인함

여기서 result는 num의 2번째 비트가 1임을 나타냅니다.


비트마스킹의 활용 사례

  • 플래그 관리: 여러 상태나 옵션을 하나의 변수로 관리할 때, 각 비트를 플래그로 사용하여 상태를 저장하고 확인할 수 있습니다.
  • 퍼미션 설정: 파일 시스템에서 읽기, 쓰기, 실행 권한을 비트마스킹으로 관리할 수 있습니다.
  • 데이터 압축 및 전송: 메모리 사용량을 줄이기 위해 데이터의 특정 부분만을 전송하거나 저장할 때 사용됩니다.
  • 하드웨어 제어: 하드웨어 장치와 통신하거나 장치를 제어할 때 특정 비트를 설정하거나 확인하는 방식으로 제어 신호를 보낼 수 있습니다.

결론

비트마스킹은 C언어와 같은 저수준 프로그래밍에서 매우 유용한 기법입니다. 메모리 효율성과 성능을 극대화하기 위해 데이터의 특정 비트를 직접 조작하거나 확인할 수 있습니다. 이 기법을 이해하고 잘 활용하면, 복잡한 비트 연산을 간결하고 효율적으로 수행할 수 있습니다.


임베디드나 시스템프로그래밍이 아니더라도 비트마스킹을 활용한 연산은 정말 빠르게 동작합니다. 따라서, 이 연산들을 활용할 수 있다면 여러분의 프로그램의 성능은 비약적으로 향상할 수 있습니다. 잘 익히고 연습해서 개발하실 때 도움이 되셨으면 좋겠습니다.


도움이 되셨다면 공감 부탁드리겠습니다. 여러분의 공감이 정말 큰 힘이 됩니다.


감사합니다!

반응형

'C++' 카테고리의 다른 글

C 기초강의: #11 조건문 - if  (0) 2024.08.24
C 기초강의: #10 반복문 - for, while  (1) 2024.08.18
C 기초강의: #8 연산자 (3)  (0) 2024.08.11
C 기초강의: #7 연산자 (2)  (1) 2024.08.10
C 기초강의: #6 연산자 (1)  (0) 2024.08.04