비트 마스킹
각 요소들의 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 << 2 시프트 연산을 통해, 두번째 비트만 1인 0100 구하기
- 1010 | 0100 OR연산을 통해, 2번째 비트를 1로 바꾸기
결과 : 1110
- 삭제 (true -> false)
1110 에서 2번째 비트를 0으로 바꾸기
- ~(1 << 2) 시프트 연산을 통해, 두번째 비트만 0인 1011 구하기
- 1110 & 1011 AND 연산을 통해 두번째 비트만 0으로 바꾸기
결과 : 1010
- 조회
1010 에서 3번째 비트가 true인지 확인
- 1 << 3 시프트 연산을 통해, 3번째 비트만 1인 1000구하기
- 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상태