프로그래밍/C++

#7. 시프트, 논리 연산

코딩하는상후니 2022. 7. 15. 22:03

 
 
*시프트 연산
<<   >>
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