TIL - 03 (비트 플래그)

jh Seo·2024년 7월 26일

비트 플래그

	enum EPorpertyFlags :unsigned char // 1byte
	{
						//16진수		2진수			왼쪽 쉬프트 연산		10진수
		ENone		=	0x00,			//0000 0000		0						0
		EProperty1	=	0x01,			//0000 0001     1<<0					1
		EProperty2	=	0x02,			//0000 0010		1<<1					2
		EProperty3	=	0x04,			//0000 0100		1<<2					4
		EProperty4	=	0x08,			//0000 1000		1<<3					8
		EProperty5	=	0x10,			//0001 0000		1<<4					16
		EProperty6	=	0x20,			//0010 0000		1<<5					32
		EProperty7	=	0x40,			//0100 0000		1<<6					64
		EProperty8	=	0x80,			//1000 0000		1<<7					128

	};

이렇게 비트 열거형을 만들어 놓으면, 해당 특성이 적용되었는 지 확인하는 데 편리함.
1번 3번이 적용되었다 라고 하면

unsigned char Property13 = EPropertyFlags::EProperty1 | EPropertyFlags::EProperty3;

비트 포함

이런식으로 | 연산자로 연산이 가능하다.
비트를 추가적으로 포함해주기 위해선 | (or연산) 을 사용한다.

unsigned char Property13 |= EPropertyFlags::EProperty4;

비트 포함되어 있는지 확인

비트가 포함되어 있는지 확인하기 위해서는 & (and 연산) 연산자를 사용한다.

if (EProperty13 &  EPropertyFlags::EProperty3)

이런식으로 &연산자를 사용하면 EProperty3에 해당하는 비트가 켜져있어야만
해당 비트에서 1을 반환한다.
따라서 연산의 결과값이 0이 안 나와 if문을 통과한다.

비트의 상태 반전은 ^ (xor 연산)을 이용한다.
상태반전을 이용해 toggle 을 구현할 수 있다.

// 토글(껏다 켰다) 원래 EProperty3이 미포함된 상태일 때
EProperty13 ^= EProperty3;    // 포함
EProperty13 ^= EProperty3;    // 미포함

비트 미포함하기 (끄기)

비트를 미포함 시키려면 ~연산자를 이용한다.
~연산자는 비트를 해당 비트의 1의 보수로 변환 시킨다.
예를들어 1100 을 ~연산을 하면 0011이 된다.
해당 비트를 미포함 시키려면

Property13 &= ~EPropertyFlags::EProperty1;

이런식으로 ~연산한 비트에 &연산을 가해주면 해당 비트가 0으로 바뀐다.

ex)
property13 = 0000 0101
~property1 = 1111 1110
& ---------------
0000 0100
1번 비트가 off되었다.

미포함과 toggle의 차이

차이는 toggle은 상태를 반전시키므로 켜져있으면 끄고 꺼져잇으면 킨다.
하지만 &~ 연산은 무조건 0으로 만든다.

반복문

c++20에서 추가된 범위기반 반복문 형태다

//CTAD(class template argument deduction: 클래스 템플릿 인수 추론
//c++20
for (std::array Array2{ 1,2,3 }; int i :Array2 ) {

}
profile
코딩 창고!

0개의 댓글