이렇게 어떠한 상태를 32가지로 나타낼 수 있다.
이런 define정의하고
각자리에 대응해야되니까 TIRED = 8로 해주어야 3번째 비트 칸에 들어 갈 수 있다.
그다음 4번째 칸에 들어갈려면
#define watered = 16;
이렇게 해주어야 4번째 비트칸에 들어감
이러한 상태들을 중첩 시킬려면 우째야될까?
처음상태는 0으로 넣고
비트 연산을
int isStatus = isStatus | HUNGRY;
뭐 이런식임
그러면 '|' 연산자는 OR이라 둘중 하나 참이면 참이라 true반환 == 즉 1로 켜줌
if로 상태 확인 할 때
이렇게 되는것인데
만약 목마른 상태에서 물마셔가지고 물마셔가지고 목이 안마르니까
목마른 상태를 빼줄 수도있어야 될것이다.
XOR 같으면 0, 다르면 1 그런데 이까지 생각하는건 좋았는데
만약 이럴경우 위에 피곤함이 0인데 (3번쨰 비트칸)
밑에서 XOR연산을 해버리니까 오히려 피곤함을 넣어버림
논리곱으로 그런 상태가 있을때만을 if문으로 확인하고 이것을 XOR로 빼 주어야한다.
그리고 사실 비트를 뺄 때 XOR 안씀
보통
이렇게하면 조건 체크를 할 필요가 없다.
지금
동그라미 부분이 "목마름"이라면
그러면 목마르다는 부분은
이렇게 되는데
그러면 일단 반전 시켜가지고
이래됨.
그래서 & 연산하면 원래자리는 그대로 내려온다.
이부분은 0이랑 1이 만나서 0이 되어버림
이렇게
결국 이렇게 1이였던것만 0으로 빠지게됨
이렇게 보통 안 쓰고 16진수로 쓴다.
그래서 숫자앞에 '0x'가 붙는다.
그런데 COLD의 경우 16 16진수에서 몇일까?
16진수가 1 2 3 4 5 6 7 8 9 a b c d e f
f = 15이다.
f에서 1이 더 더해지는 순간 다음자리로 넘어가게된다. -> 10 == 0x10 = 16이다.
16다음 32가 나와야 하는데 32는 16의 두묶음이라
#define COLD 0x10
#define POISON 0x20
이렇게됨.
#define COLD 0x01
#define COLD 0x02
#define COLD 0x04
#define COLD 0x08
#define COLD 0x10
#define COLD 0x20
#define COLD 0x40
#define COLD 0x80
#define COLD 0x100
#define COLD 0x200
#define COLD 0x400
#define COLD 0x800
이게 반복이 된다.
굳이 자리수 맞추자면은
이래됨
이런 버튼들이 있을 수도 있고 없을 수도있다.
이런거 버튼 상태값으로 만들어 놓음
그래서 하나의 값으로 내포된 의미가 존나 많다.