1. 비트마스크(BitMask) 란?
말 그대로 비크(Bit)를 마스킹 하는 기법으로, &(AND 연산자), |(OR 연산자) 등의 비트 연산을 활용하여 이진 비트를 처리하는 작업이다.
2. 비트마스크의 장점
- 메모리를 적게 사용할 수 있다.
- 프로그램이 더욱 빠르게 동작한다.
- 소스코드가 직관적이고 간결해진다.
3. 비트 연산
- AND 연산자
'&' 연산 기호를 사용하며 대응하는 비트가 모두 1일 때 1을 반환한다.
1011 & 1001 = 1001
- OR 연산자
'|' 연산 기호를 사용하며 대응하는 비트 중 하나라도 1이면 1을 반환한다.
1011 | 1001 = 1011
- XOR 연산자
'^' 연산 기호를 사용하며 대응하는 비트가 같지 않을 때 1을 반환한다.
1011 ^ 1001 = 0010
- NOT 연산자
'~' 연산 기호를 사용하며 비트를 반전한 값을 반환한다.
~1011 = 0100
- Shift 연산자
비트를 옮기는 연산으로 왼쪽으로 비트를 옮길 경우 '<<' 연산 기호를 사용하고 오른쯕으로 옮길 경우 '>>' 연산 기호를 사용한다.
001011 << 2 = 101100
001011 >> 2 = 000010
4. 비트마스크 활용
* 현재 진행 중인 프로젝트에서 비트마스크연산을 활용한 사례를 정리해보겠다.
같은 종류의 팝업을 여러 상황에 띄우는데 그 상황 마다 노출시키는 버튼의 종류가 다르다. 이 때, 버튼 고유의 상수값을 정의한 후 팝업 데이터 전달 시 필요한 버튼의 값을 함께 넘겨준다. 넘겨 받은 쪽에서 비트마스크 연산 후 결과에 따라 버튼을 노출시켜 처리한다.
- 버튼 상수값이 정의된 XXXPopupButtonMask 클래스
1
2
3
4
5
6
7
|
public class XXXPopupButtonMask
{
public const int None = 0;
public const int Remove = 1;
public const int Levelup = 2;
public const int Change = 4;
}
|
cs |
- 필요한 팝업 config 데이터 셋팅 후 팝업 오픈
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 팝업 데이터 셋팅
var popupConfig = new CXXXPopupConfig
{
InfoVO = infoVO,
ButtonMask = XXXPopupButtonMask.Remove, // 버튼 마스크 값 전달
...
};
// 팝업 오픈
var popup = CModelManager.Instance.Get<CPopupModel>().Open<CXXXPopupPresenter>(
...
config: popupConfig
);
|
cs |
- 전달 받은 config 값 중 버튼 값을 비트마스트 연산하는 구문 ★★★
버튼 종류마다 AND(&)연산 하여 결과 값에 따라 버튼을 노출 여부 결정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// Remove 버튼에 대한 비트마스크 연산
if ((config.ButtonMask & XXXPopupButtonMask.Remove) == XXXPopupButtonMask.Remove)
{
ActiveRemoveButton.gameObject.SetActive(true);
...
}
// Levelup 버튼에 대한 비트마스크 연산
if ((config.ButtonMask & XXXPopupButtonMask.Levelup) == XXXPopupButtonMask.Levelup)
{
ActiveLevelupButton.gameObject.SetActive(true);
...
}
// Change 버튼에 대한 비트마스크 연산
if ((config.ButtonMask & XXXPopupButtonMask.Change) == XXXPopupButtonMask.Change)
{
ActiveChangeButton.gameObject.SetActive(true);
...
}
|
cs |
- 결과
- 여러 종류의 버튼이 노출되야 하는 경우
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 팝업 데이터 셋팅
var popupConfig = new CXXXPopupConfig
{
InfoVO = infoVO,
ButtonMask = XXXPopupButtonMask.Remove | HeroGearInfoPopupButtonMask.Levelup | HeroGearInfoPopupButtonMask.Change, // 버튼 마스크 값 전달
...
};
// 팝업 오픈
var popup = CModelManager.Instance.Get<CPopupModel>().Open<CXXXPopupPresenter>(
...
config: popupConfig
);
|
cs |
- 결과
'└ Unity' 카테고리의 다른 글
[Unity] 애니메이션 종료 시점 이벤트 (0) | 2022.07.18 |
---|---|
[Unity] UniRx 정리 (0) | 2021.04.27 |