비트 연산자 테크닉

DongWook Lee·2024년 7월 18일

C++

목록 보기
11/18

상태 비트 다루기

enum CharState {NONE, STAND=1, MOVE_HASTE=2, STRONG=4, ATTACK_HASTE=8,
		POISON=0X10, ANGRY=0X20}

bit on (합집합)

char state = NONE;				// 0          : {}
state |= STAND;					// 1  =00000001 : + {1} = {1}
state |= STRONG | ANGRY;		// 37 =00100101 : + {4, 32} = {1, 4, 32}

bit off (차집합)

state &= ~MOVE_HASTE;			// 37 =00100101 : - {2} = {1, 4, 32}
state &= ~(STRONG | POISON);	// 33 =00100001 : - {4, 16} = {1, 32}

bit 반전 (대칭차집합)

state ^= STRONG;				// 37 =00100101 : xor {4} = {1, 4, 32}

bit값 검사 (교집합)

if (state & ATTACK_HASTE)		// false
	실행구문;

n번째 비트 다루기

n번째 bit만 on

int n = 4;
char bit = 1 << n;					// 00010000

하위 n개를 제외한 나머지 bit on

bit = -1 << n;						// 11110000
state |= bit;						// 00100101 --> 11110101

하위 n개의 bit on

bit = (1 << n) - 1;					// 00001111
state |= bit;						// 11111111

하위 n개의 bit만 남기기 (남은 상위비트 off)

state &= bit;						// 00001111

하위 n개의 bit off (남은 상위비트만 남기기)

state &= ~bit;						// 00000000

그 밖의 연산들

2의 거듭제곱 여부 (bit 한개만 on인지)

// state = POISON;					// 16 =00010000
state = MOVE_HASTE | ATTACK_HASTE;	// 10 =00001010
bool b = state & (state-1) == 0;	// false

켜진 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);	// 2

마지막 bit 구하기

bit = state & -state				// 2 =00000010

마지막 bit off

state &= state-1					// 0 =00000000

0개의 댓글