hahahia

쉬프트 연산( << , >> ) 본문

Algorithm

쉬프트 연산( << , >> )

hahahia 2012. 9. 1. 18:13

음 보통 알고리즘 문제 풀거나 계산을 많이 하는 과정에서 *2를 하거나 /2를 하는 계산이 꽤나 많이 있는데....(2의 n승 전부)

보통은 a *= 2, 또는 a /= 2 이런식으로 곱하기 나누기를 하지만 사실은 그것보다 더 시간을 빠르게 사용하여 계산을 할 수 있다.

그것이 바로 쉬프트연산!!!!!!!!!


간단하게 숫자 5로 예를 들어보겠습니다. 숫자 5를 2진수로 나타내면(8bit)


 0

0

 0

 0

 1

 0

 1


이런식으로 나타나겠죠??

그럼 이 숫자 5에다가 2를 곱해보겠습니다. 그러면 5 * 2 = 10 이 되겠죠

이 숫자 10을 다시 2진수로 나타내보도록 하겠습니다


 0

 0

 0

 0

 1

 0

 1

 0   


자 여기서 벌써 알아보신분들도 계실텐데...(아닌가 ㅎㅎ) 1이 있는 비트들이 왼쪽으로 한칸씩 이동한 것을 볼 수 있죠 ㅎㅎ


#include <iostream>

using namespace std;

 

int main(){

        int a = 5;

        a = a << 1;

        cout << a << endl;

        return 0;

}


이런식으로 하게 되면 a는 10이 출력될 것입니다.

마찬가지로 5에서 4(2의 2승)을 곱하면 20이 되겠죠.

그렇게되면 쉬프트연산을 하게되면


 0

 0

 0

 1

 0

 1

 0

 0      


자 두칸씩 더 왼쪽으로 간 것을 확인할 수 있나요?ㅎㅎ

a = a << 2; 이런식으로 하면 a가 5였다면 20으로 되겠습니다.

 

그리고 반대로 현재 20인 a에서

a = a >> 2; 쉬프트 연산을 반대로 하게되면 어떻게 될까요



 0

 0

 0

 0

 0

 1

 0

 1    


자 보이시나요?? 다시 오른쪽으로 두칸 이동해서 20/4 = 5 가 되겠죠.


#include <iostream>

using namespace std;

 

int main(){

        int a = 20;

        a = a >> 2;

        cout << a << endl;

        return 0;

}

 

이런식으로 코딩해서 출력해보면 a의 값이 5가 나온다는 것을 알 수 있습니다.

2의 n승(n=1, 2, 3, 4, 5, .....)의 곱셈 나눗셈 연산을 이러한 쉬프트 연산을 이용해서 더 빠르게 계산할 수 있겠습니다.ㅎㅎ

Comments