*시프트 연산
<< >>
long long test = (23LL << 3);
int test2 = (1 << 3);
*부호가 음수일 때는 시프트 연산 시 어떻게 동작할까 ??
ex)
-78
10110010b (-78) >> 1
11011001b (-39) >> 1
11101100b (-20) >> 1
*부호 있는 숫자일 때,
*양수일때
모두 0 으로 채움.
*음수일때
<< 일 땐, 0
>> 일 땐, 1 로 채워짐
*Shift 연산은 어느 상황에 사용할까??
=> 비트 연산으로 빠르게 처리할 수 있는 상황들이 존재.
* << 시, *2 하는것과 같음.
* >> 시, /2 하는 것과 같음.
>> 2칸을 이동하면 /4 하는 것과 같음.
*게임 서버에서 ObjectID 를 만들어 줄 때 ??
64bit 는 굉장히 큰 숫자인데 아무리 동접 수가 많아도 상위 bit 를 쓸 일이 없음.
예를 들어,
long long ObjectID = 1000000;
천만 동접자의 고유의 ID 를 표현해도 224 를 넘어가지 않음.
따라서, 남는 최상위 bit 를 활용해 그것이 몬스터인지, 플레이어인지 ..등등 판별 가능.
*논리연산
not / and / or / xor
조건A : 잘생겼다.
조건B : 키가 크다.
=> not A : 잘생겼다의 반대 -> ( 0이면 1, 1이면 0 )
=> A and B : 잘생기고 and 키도크다. -> ( 둘 다 1이면 1, 아니면 0 )
=> A or B : 잘생겼거나 or 키가 크거나. -> ( 둘중하나라도 1이면 1, 아니면 0 )
=> A xor B : 잘생기고 작거나 xor 못생기고 크거나. -> ( 둘다 1이거나 둘다 0 이면 0, 아니면 1 )
결국,
and : 둘 다 1이면 1
or : 1이 하나 이상이면 1
xor : 하나만 1이면 1
*논리연산은 어느 상황에 사용할까 ??
1. bitfalg
=> 비트 상태 ( 날수 있는지, 수영을 할 수 있는지..등 )
2. 똑같은 두 값을 'xor' 을 두 번 하게되면 동일한 값이 됨.
=> 암호학에서 유용
*자기 자신을 'xor' 하게 되면 0 이됨.
*32비트보다 큰 값을 연산할 때
ex ) long long hp = ( 1LL << 63 ) / (1i64 << 63 )
=> 1 이란 수는 int 형이기 때문에 long long 의 맨 앞 bit 까지 가질 못함.
본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다.
'프로그래밍 > C++' 카테고리의 다른 글
#9. 어셈블리 반복문 (0) | 2022.07.15 |
---|---|
#8. 어셈블리 분기문 (0) | 2022.07.15 |
#6. 사칙연산 (0) | 2022.07.15 |
#5. 문자와 엔디안 (0) | 2022.07.15 |
#4. 변수와 레지스터 (0) | 2022.07.15 |