팀(Tim)
개발자의 글쓰기
팀(Tim)
전체 방문자
오늘
어제
  • 분류 전체보기 (49)
    • 알고리즘 (2)
    • 개발전반 (1)
    • 안드로이드 앱개발 (25)
    • 코틀린 (1)
    • C++ (11)
    • Unity (0)
    • 공지사항 (4)
    • WebGL (0)
    • Flutter (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • d

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
팀(Tim)

개발자의 글쓰기

C++

비트연산으로 flag주기

2020. 10. 27. 01:38

프로그램을 개발하다보면 enum이라는 녀석을 사용하게된다.

주로 무언가를 구분하거나 옵션을 제공할때 쓰이는데 여기서는 옵션을 제공할때를 살펴보자.

MOVABLE(움직일 수 있는), ATTACKABLE(공격할 수 있는) 이라는 두가지 옵션을 한꺼번에 제공해야한다면 어떻게할까?

 

enum STATE { MOVABLE, ATTACKABLE, MOVABLE_AND_ATTACKABLE, END }

 

이렇게 사용할 수는 있다. 그러나 매번 이렇게 따로 항목을 추가하는건 번거롭다.

이럴때 사용할 수 있는게 비트연산이다.

 

    #define DT_TOP              0x00000000
    #define DT_LEFT             0x00000000
    #define DT_CENTER           0x00000001
    #define DT_RIGHT            0x00000002
    #define DT_VCENTER          0x00000004
    #define DT_BOTTOM           0x00000008
    #define DT_WORDBREAK        0x00000010
    #define DT_SINGLELINE       0x00000020
    #define DT_EXPANDTABS       0x00000040
    #define DT_TABSTOP          0x00000080
    #define DT_NOCLIP           0x00000100
    #define DT_EXTERNALLEADING  0x00000200
    #define DT_CALCRECT         0x00000400
    #define DT_NOPREFIX         0x00000800
    #define DT_INTERNAL         0x00001000

 

수평 정렬을 하는 옵션, 수직 정렬을 하는 옵션, 개행 여부, 여러줄 출력 등의 옵션들이 있다고하자.

이 많은 옵션들이 OR 연산자로 연결되어 딱 하나의 인수로 전달된다. 

예를 들어 DT_CENTER | DT_BOTTOM | DT_WORDBREAK 등과 같이 하면 세가지 옵션을 하나의 인수로 

전달한 것이다. 

한 인수에 이렇게 여러가지 옵션을 같이 전달할 수 있는 이유는 각 옵션이 비트별로 배정되어 있어

상호 간섭을 하지 않기 때문이다. ( OR 연산을해보면 더 옵션들은 서로의 자리수를 침범하지 않는다는 걸 알 수 있다.)

옵션들의 실제값을 보면 옵션값들이 1, 2, 4, 8, 10 등과 같이 2의 거듭승으로 정의되어 있어 

옵션별로 비트 자리가 정해져있다. 

'C++' 카테고리의 다른 글

STL - vector  (0) 2020.10.27
STL  (0) 2020.10.27
탬플릿  (0) 2020.10.27
인라인함수, 매크로함수  (0) 2020.10.27
타입 캐스팅  (0) 2020.10.27
    'C++' 카테고리의 다른 글
    • STL
    • 탬플릿
    • 인라인함수, 매크로함수
    • 타입 캐스팅
    팀(Tim)
    팀(Tim)

    티스토리툴바