비트 논리 연산자는 이진수(2진수) 단위로 연산을 수행합니다. 여기서 &
, |
, ^
연산자 등이 사용되며, 각 비트에 대한 논리 연산을 통해 새로운 값을 생성합니다.
const int iAttack = 0x00000001; // 16진수 1, 2진수로는 0001
const int iArmor = 0x00000002; // 16진수 2, 2진수로는 0010
const int iHP = 0x00000004; // 16진수 4, 2진수로는 0100
const int iMP = 0x00000008; // 16진수 8, 2진수로는 1000
const int iCritical = 0x00000010; // 16진수 10, 2진수로는 10000
int iBuf = iAttack | iHP | iCritical;
iBuf
변수에 iAttack
, iHP
, iCritical
을 OR 연산으로 결합합니다.iBuf ^= iHP;
iBuf
의 iHP
부분을 반전시킵니다.iBuf
값은 10101(2진수)였고, iHP
는 00100(2진수)이므로 XOR 연산 후 결과는 10001(2진수)이 됩니다.cout << "Attack : "<< (iBuf & iAttack) << endl;
cout << "Armor : " << (iBuf & iArmor) << endl;
cout << "HP : " << (iBuf & iHP) << endl;
cout << "MP : " << (iBuf & iMP) << endl;
cout << "Critical : " << (iBuf & iCritical) << endl;
iBuf & iAttack
의 결과는 1
이므로, "Attack"은 활성화되어 있습니다.쉬프트 연산자는 비트의 위치를 좌측(<<
) 또는 우측(>>
)으로 이동시켜 값을 변환합니다. 이 연산자는 주로 고속 계산이나 특정 비트를 추출하는 데 사용됩니다.
int iHigh = 187;
int iLow = 13560;
int iNumber = iHigh;
iNumber <<= 16; // iNumber를 왼쪽으로 16비트 이동시켜 상위 16비트를 채움
iNumber |= iLow; // 하위 16비트를 iLow 값으로 채움
iHigh
값인 187(10진수)을 iNumber
에 저장하고, 이 값을 왼쪽으로 16비트 이동시킵니다. iNumber
는 187이 상위 16비트에 위치하게 됩니다.iLow
값을 OR 연산으로 하위 16비트에 채웁니다.cout << "High : " << (iNumber >> 16) << endl;
cout << "Low : " << (iNumber & 0x0000ffff) << endl;
iNumber
의 상위 16비트를 얻기 위해 우측으로 16비트 쉬프트한 후 출력합니다.0x0000ffff
와 AND 연산을 수행합니다.전치(++iNumber)와 후치(iNumber++) 연산자는 변수의 값을 1씩 증가시키지만, 적용되는 시점에 차이가 있습니다.
iNumber = 10;
cout << ++iNumber << endl; // 11 출력, iNumber는 11로 증가
cout << iNumber++ << endl; // 11 출력, 이후 iNumber는 12로 증가
cout << iNumber << endl; // 최종적으로 12 출력
iNumber
가 11이 됩니다.iNumber
는 12로 증가합니다.이번 포스트에서는 비트 논리 연산자와 쉬프트 연산자의 기본 개념과 활용 방법을 예제를 통해 이해했습니다. 또한 전치와 후치 연산자의 차이를 코드로 확인함으로써 연산자가 어떻게 동작하는지에 대한 이해를 높였습니다. 이러한 연산자들은 고성능 프로그래밍이나 하드웨어 제어와 같은 분야에서 매우 유용하게 사용되므로, 기본 개념을 잘 이해하고 다양한 응용을 시도해보는 것이 중요합니다.