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은 상태를 반전시키므로 켜져있으면 끄고 꺼져잇으면 킨다.
하지만 &~ 연산은 무조건 0으로 만든다.
c++20에서 추가된 범위기반 반복문 형태다
//CTAD(class template argument deduction: 클래스 템플릿 인수 추론
//c++20
for (std::array Array2{ 1,2,3 }; int i :Array2 ) {
}