공부/C, C++
[C] 비트 연산자 (<<, >>, &, |, xor, ~)
김샤랑
2022. 1. 1. 14:15
[C] 비트 연산자 (<<, >>, &, |, xor, ~)
- 비트 연산자란?
비트 단위로 연산이 진행될 때 사용하는 연산자이다.
쉬프트 <<, >> 을 사용한다.
- << (왼쪽 쉬프트)
unsigned char byte = 1; // 0000 0001
byte << 1; // 왼쪽으로 한 칸 이동, 0000 0010
각각이 한칸씩 올라가기 때문에 전체는 두 배가 된것이다.
byte <<= 1; // 왼쪽으로 쉬프트 한 것을 대입받는다. byte = byte << 1;
byte <<= 3; // 3배 증가
값은 2^n 배수
- >> (오른쪽 쉬프트)
unsigned char byte = 13; // 0000 1011
byte >>= 1; // 0000 0101
값은 2^n 나눈 몫
- 비트 곱(&), 합(|), xor(^), 반전(~)
두 변수를 비트 단위로 비트끼리 연산한다.
- & 은 두 비트가 둘 다 1이면 1, 둘 중 하나라도 0이 있으면 0
- | 은 둘 중 하나라도 1이 있으면 1, 둘 다 0이면 0.
- xor 은 두 비트가 같으면 0, 다르면 1
- ~ 1101 0101 은 0010 1010이 된다. (1 -> 0, 0 -> 1)
- 상태 체크 예시
#define HUNGRY 0x1 // ~ 앞 생략 0001
#define THIRSTY 0x2 // ~ 앞 생략 0010
#define TIRED 0x4 // 비트 단위로 쓸거라 3대신 4를 넣었다. // ~ 앞 생략 0100
#define FIRE 0x8
#define COLD 0x10 // 16이다.
#define POSION 0x20 // 32이다.
// 16진수는 1~F 까지 있다. '0x숫자' 로 표현한다.
int iStatus = HUNGRY;
iStatus |= HUNGRY; // 비트를 합쳐서 다른 곳을 고치지 않은 채로 상태를 합침
iStatus |= THIRSTY;
- 내 상태가 목마른가?
if (iStatus & THIRSTY) // 둘 다 1일 때만 1이 나온다. THIRSTY 0010이 있으면 1부분이 겹쳐서 if 문 수행
{
}
- 피곤함(TIRED) 상태를 해제한다. 그런데 애초부터 피곤함이 아니면?
xor을 쓸 경우 피곤함 상태였다면 피곤함을 해제시켰겠지만, 피곤함이 아니었다면 피곤함이 추가되는 문제 발생
- 특정 자리 비트 제거
iStatus &= ~THIRSTY;
상태는 그대로 두고, 제거할 상태를 비트 반전 시킨다. 그런 다음 곱 연산을 하면 상태 부분이 무조건 0으로 내려온다.
예시)
iStatus 1110 1010
~THIRSTY 1111 1101
1110 1000
iStatus 에서 0인 경우에도 둘 다 0이기 때문에 곱 연산시 0이 내려온다. 이 코드를 봤을 때 '비트를 빼겠다는 거구나'라고 바로 알아차릴 수 있도록 외워두자.