Server/C++

연산자 (Operator)

Juzdalua 2024. 7. 20. 14:32

- CPU에서 연산을 진행한다.

- 연산이 종료되면 CPU 내부 레지스터 메모리에 임시로 값을 저장한다.

- 결과값을 받을 변수가 없고, 다음 연산이 진행되면 이전에 진행되었던 연산 결과는 사라지고 새로운 결과값이 레지스터 메모리에 저장된다.


비트연산자

* 쉬프트 ( << , >> )

비트를 방향으로 1비트씩 이동시킨다.

char a = 1; // 0000 0001
a = a << 1; // 0000 0010 => a <<= 1;

이진법에서 왼쪽으로 1비트 이동하면 십진수 값으로 기존 값의 2^1배가 된다.

char b = 10; // 0000 1010
b <<= 3; // // 0101 0000 => b = 80

 

이진법에서 오른쪽으로 1비트 이동하면 십진수 값으로 기존 값의 2^1으로 나눈 몫이 된다.

오른쪽으로 넘어가 저장공간을 벗어난 비트는 사라지므로 나머지는 없어진다.

 

* AND( & ), OR( | ), XOR( ^ ), NOT( ~ )

// & : 대응하는 비트가 모두 1일 경우에 1을 반환
0000 0110
0000 0101
=> 0000 0100

// | : 대응하는 비트 중 하나라도 1일 경우 1을 반환
0000 0110
0000 0101
=> 0000 1011

// ^ : 같으면 0, 다르면 1 반환
0000 0110
0000 0101
=> 0000 0011

// ~ : 0은 1로, 1은 0으로 반전
0000 0110
=> 1111 1001

비트는 상태를 표현할 수 있다.

0000 0001 => 피격 중인 상태 <-> int a = 1;
0000 0010 => 달리는 중인 상태 <-> int a = 2;
0000 0100 => 쓰러진 상태 <-> int a = 4;
0000 1000 => 공격 중인 상태 <-> int a = 8;

unsigned int status;
status = 3; // 0000 0011 => 피격중이고 달리는 상태
status |= 4 // 0000 0111 => 피격 + 달리는 + 쓰러진 상태

// 현재 달리는 상태면 0이 아닌 참을 반환
int isSprint = 2;
if( status & isSprint ) {
0000 0111
0000 0010
-> 0000 0010 => 2
}

// 특정 위치의 비트 제거
status &= ~isSprint
0000 0111
1111 1101
-> 0000 0101 => isSprint 제거