비트마스킹

haram·2023년 2월 24일
0

비트 마스킹

각 요소들의 true/false여부를 저장 할 때 사용한다. 비트이기 때문에 오버헤드가 작다는 장점이 있다.

시프트 연산

int num01 = 15; int num02 = 8;

  • ~num01 // 1의 보수 – num01의 비트를 반전
  • num02 << 1 // 곱하기 2 – num01의 비트를 왼쪽으로 1만큼 이동
  • num02 >> 1 // 나누기 2 – num01의 비트를 오른쪽으로 1만큼 이동

비트 마스킹 활용법

배열의 인덱스와 같이 0번부터 시작한다. 단 오른쪽부터 인덱스를 매긴다.

  • 삽입 (false -> true)
    1010 에서 2번째 비트를 1로 바꾸기
  1. 1 << 2 시프트 연산을 통해, 두번째 비트만 1인 0100 구하기
  2. 1010 | 0100 OR연산을 통해, 2번째 비트를 1로 바꾸기
    결과 : 1110
  • 삭제 (true -> false)
    1110 에서 2번째 비트를 0으로 바꾸기
  1. ~(1 << 2) 시프트 연산을 통해, 두번째 비트만 0인 1011 구하기
  2. 1110 & 1011 AND 연산을 통해 두번째 비트만 0으로 바꾸기
    결과 : 1010
  • 조회
    1010 에서 3번째 비트가 true인지 확인
  1. 1 << 3 시프트 연산을 통해, 3번째 비트만 1인 1000구하기
  2. 1010 & 1000 AND연산을 통해 결과값이 1이상이면 true, 0이면 false

int a = 5; // 0101
a |= (1<<3); //비트 켜기 1101
a &= ~(1<<2); //비트 끄기 1001

System.out.print(a); //1001 = 9
//비트확인
System.out.print(a & 1<<3); //3번째 비트 확인 1001이므로 true상태

0개의 댓글