C++/C++
[C++] 비트 연산, 비트맵마스크
sihyeong
2022. 11. 20. 02:27
비트맵 마스크
- 정수의 이진수 표현을 자료 구조로 쓰는 기법
장점
- 수행시간 빠르다.
- 코드가 짧다.
- 메모리 사용량이 적다.
char : 1byte
true, false 표현하기 위해 1bit만 쓰고 있음
char의 8bit를 비트맵 마스크를 이용해서 사용하면 char 하나로 char c[8]; 의 사용 효과를 누릴 수 있다.
유니티에서는 레이어간 충돌 여부 등을 설정할 때 이러한 비트맵 마스크 사용함
설명을 위해 간단하게 4bit를 가지고 그림을 그렸음
- 0번 콜라이더 / 2번 콜라이더 충돌 처리를 한다.
- 1번 콜라이더 / 2번 콜라이더 충돌 처리를 한다.
- 2번 콜라이더 / 3번 콜라이더 충돌 처리를 한다.
- 3번 콜라이더 / 3번 콜라이더 충돌 처리를 한다.
- 위 처럼 나타내면 (0,2) (2,0)과 같은 동일한 반대편의 연산을 줄일 수 있다.
- 충돌판정에서 충돌판정을 위해 등록된 특정한 콜라이더나 오브젝트끼리 충돌 판정을 하지 않는다면 모든 오브젝트나 콜라이더끼리 충돌 판정을 해야해서 엄청나게 느려질 것이다.
- 충돌 판정을 위해 모든 콜라이더를 판별하는 것이 아닌 충돌처리를 원하는 콜라이더 끼리만 충돌 판정을 하여 속도를 높인다.
- 충돌 판정 시 주의점 : 3을 (player collider)라고 했을 때 (3,3)끼리 충돌 판정을 해야 하는데 본인과 본인을 충돌처리 하는 것을 제외 시켜야 한다.
연산 | 사용 예시 |
공집합과 꽉 찬 집합 구하기 | A = 0; / A = (1 << (k+1)) - 1; |
원소 추가 (0 →1, 1→1) | A |= (1 << k); |
원소 삭제 (1→ 0, 0→0) | A &= ~(1 << k); |
원소 포함 여부 확인 | if(A & (1 << k)) |
원소 토글 (0→1, 1→0) | A ^= (1 << k); |
집합 크기 구하기 | int bitCount(int A){ if(A == 0) return 0; return A%2 + bitCount(A / 2); } [내장 명령어] visual C++ → __popcnt(A) |