본문 바로가기
└ Unity

[C#] 비트마스크(BitMask) 연산 및 활용

by 짜장이누나 2022. 2. 28.

 

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