상태 비트 다루기
enum CharState {NONE, STAND=1, MOVE_HASTE=2, STRONG=4, ATTACK_HASTE=8,
POISON=0X10, ANGRY=0X20}
bit on (합집합)
char state = NONE;
state |= STAND;
state |= STRONG | ANGRY;
bit off (차집합)
state &= ~MOVE_HASTE;
state &= ~(STRONG | POISON);
bit 반전 (대칭차집합)
state ^= STRONG;
bit값 검사 (교집합)
if (state & ATTACK_HASTE)
실행구문;
n번째 비트 다루기
n번째 bit만 on
int n = 4;
char bit = 1 << n;
하위 n개를 제외한 나머지 bit on
bit = -1 << n;
state |= bit;
하위 n개의 bit on
bit = (1 << n) - 1;
state |= bit;
하위 n개의 bit만 남기기 (남은 상위비트 off)
state &= bit;
하위 n개의 bit off (남은 상위비트만 남기기)
state &= ~bit;
그 밖의 연산들
2의 거듭제곱 여부 (bit 한개만 on인지)
state = MOVE_HASTE | ATTACK_HASTE;
bool b = state & (state-1) == 0;
켜진 bit의 개수
int n_bits(char bits) {
int count = 0;
do if (bits & 1) count++;
while (bits >>= 1);
return count;
}
int n_bits2(char bits) {
return (bits & 1) + (bits > 1 ? n_bits2(bits >> 1) : 0);
}
...
...
int n_states = n_bits(state);
마지막 bit 구하기
bit = state & -state
마지막 bit off
state &= state-1