C++의 비트 연산자는 <<, >>, &, |, ~, ^ 가 있다. 차례대로 각자 무슨 역할을 하는지 알아보자.
먼저 <<, >>는 시프트 연산자라고도 한다. <<, >> 는 각각 비트값을 왼쪽, 오른쪽으로 이동시켜주는 연산을 하는 연산자 이다. 예시를 보면서 어떻게 연산되는지 확인해 보겠다.
num의 값에 10진수 1이 들어가 있는 상태이다. 즉 메모리 공간에 아래의 그림과 같이 저장되어있을 것이다.
여기서 << 1은 왼쪽으로 한칸씩 밀으라는 얘기이다. num = 1인 상태에서 왼쪽씩 한칸으로 민다는 것은
위에 그림처럼 1을 의미하고있던 자리의 비트가 왼쪽으로 한칸 이동하여 2가 된것이다. 값이 2로 변했다는 사실을 디버깅을 통해 확인할수 있다.
이처럼 <<는 왼쪽 방향으로 비트를 1칸씩 민다는것을 의미한다. 비트가 왼쪽 한칸씩 밀린다는 것은 다른말로 얘기하자면
결과 값이 2^n 배 증가한다는 것이다. (여기서 n은 몇칸 밀었는지), 만약 num의 값을 2로 변경하고 왼쪽으로 4칸을 밀었다고 가정해보자. 그렇다면 값이 얼마가 나올것 같은가?
위의 프로그램 결과값 처럼. num 2를 왼쪽 으로 4칸 밀었더니 32라는 값이 나왔다.
즉 2 * 2^4 = 2* 16 = 32라는 값이 나오게 되는것이다. 이처럼 왼쪽 비트로 민 다는것은 결과 값이 2의 n을 곱한 만큼 값이 커진다는 것을 의미한다.
자, 그렇다면 >>으로 밀게되면 값은 어떻게 변화할까?
위 코드처럼 num = 2의 값을 >>1, 즉 비트값을 오른쪽으로 1칸 밀게 되면,
2를 나타내는 비트들이 전부 한칸씩 오른쪽으로 이동한다는 것이다. 즉 00000010 -> 00000001이 된다는 것이다.
그렇다면 결과 값은 어떻게 될까? 결과는 원래 값의 1/2이 된다는 것이다.
그렇다면 만약 num = 5, 2진수로 표현하면 101인 비트를 오른쪽으로 1칸 밀면 어떻게 될까?
그럴경우 101의 1을 나타내던 마지막 1의 값은 더 이상 오른쪽으로 이동할 공간이 없으므로 버려지게 되는것이다.
즉 101 -> 10이되는것이다. 2진수 10은 10진수 2이므로 값은 2가 나오게 될것이다.
디버깅 결과값 역시 2가 나오게 되었다. 이를통해 우리가 알수있는 점은 오른쪽으로 비트를 밀경우
원래 값의 나누기 2^n (여기서 n은 몇칸 밀었는지)이 된다는 것이다. 조금더 예를들기 위해 2진수 (11011)를 시프트 연산자를 통해 오른쪽으로 3칸 밀어보겠다. 2진수 11011은 10진수 27이다. 앞선 공식에 따르면 오른쪽으로 3칸 밀었으니
원래 결과값을 8로 나눈 값으로 변하게 될것이다. 27 / (2^3) = 27 / 8 = 3 즉 2진수 11이 남게 되는것을 예상할수 있다.
디버깅 결과 역시 예상과 같이 나오게 되었다. 이를 통해 왼쪽 시프트 <<는 원래 값의 2^n을 곱한 만큼 커지고
오른쪽 시프트 >>는 원래 값의 2^n을 나눈만큼 작아진다는 것을 알수 있다.
'C++' 카테고리의 다른 글
C++ 게임에서의 비트 연산 활용 (1) | 2023.11.04 |
---|---|
C++ 비트 연산자 (&, |, ^, ~) (2) | 2023.11.04 |
C++ 실수 표현 방식 (0) | 2023.11.03 |
C++ 정수 자료형 (0) | 2023.11.02 |
비주얼 스튜디오에서 C++ 프로젝트 생성하는 법 (0) | 2023.11.02 |