728x90
개요
비트마스킹(Bit Masking)은 비트 연산을 활용하여 데이터의 특정 비트를 조작하거나 확인하는 방법입니다.
효율적으로 데이터를 저장, 처리, 그리고 계산할 수 있는 장점이 있어 프로그래밍에서 널리 사용됩니다. 특히, 알고리즘 문제 해결, 시스템 프로그래밍, 데이터 압축 등의 분야에서 주로 활용됩니다.
비트란 ?
비트(Bit)는 Binary Digit의 줄임말로, 컴퓨터가 정보를 표현하고 처리하는 가장 기본적인 단위입니다.
비트는 0 또는 1의 두 가지 상태를 가질 수 있으며, 이는 디지털 시스템에서 데이터를 저장하거나 전송할 때 사용됩니다.
n비트 정수형 변수는 2^0 ~ 2^n-1까지 표현할 수 있습니다.
비트의 개념
- 디지털 정보의 최소 단위
- 비트는 0과 1이라는 두 상태로만 정보를 표현합니다.
- 이진법(Binary System)
- 컴퓨터는 전기 신호(ON/OFF)로 데이터를 처리하므로 이진법을 기반으로 동작합니다.
- 0: 신호가 꺼진 상태 (Low Voltage)
- 1: 신호가 켜진 상태 (High Voltage)
- 컴퓨터는 전기 신호(ON/OFF)로 데이터를 처리하므로 이진법을 기반으로 동작합니다.
비트 마스킹(Bit Masking)이란 ?
비트마스킹은 비트(bit)의 상태(0 또는 1)를 이용하여 데이터를 표현하거나 관리하는 방식입니다. 마스킹(masking)이라는 용어는 특정 비트를 가리거나 선택적으로 다루는 작업에서 유래되었습니다.
- 비트 연산: 비트마스킹의 핵심은 AND, OR, XOR, NOT과 같은 비트 연산자입니다.
- AND(&)
- 특정 비트를 끌어냄 (0으로 마스킹)
- OR(|)
- 특정 비트를 설정 (1로 마스킹)
- XOR(^)
- 특정 비트를 반전
- NOT(~)
- 비트 반전 (1을 0으로, 0을 1로)
- AND(&)
비트 마스킹(Bit Masking)의 주요 활용
1. 특정 비트 확인
정수의 특정 비트가 1인지 0인지 확인할 때 사용됩니다.
int number = 5; // 5 = 0101 (2진수)
int bitPosition = 1; // 확인하려는 비트 위치 (0부터 시작)
// 비트 확인
boolean isSet = (number & (1 << bitPosition)) != 0;
System.out.println(isSet); // true
- 1 << bitPosition
- 원하는 위치에 1을 세팅한 비트마스크를 생성합니다.
- number & mask
- AND 연산으로 해당 위치의 비트를 추출합니다.
2. 특정 비트 설정
특정 비트를 1로 설정합니다.
int number = 5; // 5 = 0101
int bitPosition = 2; // 설정하려는 비트 위치
// 비트 설정
number |= (1 << bitPosition);
System.out.println(number); // 101 = 7
- number | mask
- OR 연산으로 특정 위치의 비트를 1로 만듭니다.
3. 특정 비트 해제
특정 비트를 0으로 설정합니다.
int number = 7; // 7 = 0111
int bitPosition = 1; // 해제하려는 비트 위치
// 비트 해제
number &= ~(1 << bitPosition);
System.out.println(number); // 0101 = 5
- ~(1 << bitPosition)
- 특정 위치를 0으로 설정한 비트마스크를 생성합니다.
- number & mask
- AND 연산으로 해당 위치의 비트를 0으로 만듭니다.
4. 비트 반전
특정 비트를 반전(1 -> 0, 0 -> 1)합니다.
int number = 5; // 5 = 0101
int bitPosition = 0; // 반전하려는 비트 위치
// 비트 반전
number ^= (1 << bitPosition);
System.out.println(number); // 0100 = 4
- number ^ mask
- XOR 연산으로 비트를 반전시킵니다.
5. 부분 집합 생성
비트마스킹은 집합을 효율적으로 표현할 때도 사용됩니다. 예를 들어, 크기가 n인 집합의 모든 부분집합을 비트마스크를 이용해 구할 수 있습니다.
int[] set = {1, 2, 3}; // 집합
int n = set.length; // 원소 개수
// 모든 부분집합 생성
for (int mask = 0; mask < (1 << n); mask++) {
System.out.print("{ ");
for (int i = 0; i < n; i++) {
if ((mask & (1 << i)) != 0) { // i번째 원소 포함 여부 확인
System.out.print(set[i] + " ");
}
}
System.out.println("}");
}
- mask & (1 << i): mask의 i번째 비트가 1인지 확인합니다.
- i번째 비트가 1이면 mask에서 해당 원소가 부분집합에 포함됨을 의미합니다.
{ }
{ 1 }
{ 2 }
{ 1 2 }
{ 3 }
{ 1 3 }
{ 2 3 }
{ 1 2 3 }
비트 마스킹(Bit Masking)의 장점
1. 메모리 효율성
- 데이터를 비트 단위로 표현하므로 메모리 사용을 최소화할 수 있습니다.
2. 속도
- 비트 연산은 CPU 레벨에서 실행되기 때문에 매우 빠릅니다.
3. 표현력
- 집합, 플래그, 상태 등을 비트마스크로 간단히 표현할 수 있습니다.
비트 마스킹(Bit Masking)의 한계
- 가독성: 코드가 복잡해지고 읽기 어려워질 수 있습니다.
- 확장성 부족: 비트 수가 제한적이므로 대규모 데이터를 표현할 때는 제한이 있습니다.
'Language > Java' 카테고리의 다른 글
[JAVA] Exception vs RuntimeException: 커스텀 예외에서 RuntimeException을 선택하는 이유 (0) | 2024.09.23 |
---|---|
[JAVA] Lombok이란 무엇일까❓(lombok 설치 방법, lombok사용법) (0) | 2024.07.20 |
[JAVA] 람다 표현식을 활용한 정렬 기법: 오름차순과 내림차순 (1차원, 2차원) (0) | 2024.07.10 |
[JAVA] 좌표와 2차원 배열 매핑의 이해 (좌표 ➡️ 배열) (0) | 2024.07.01 |
[Java] copyOf(), arraycopy(), copyOfRange() 메서드 알아보기 ✔ (배열 복사 메서드) (0) | 2024.06.16 |