일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- java
- Sort
- beans
- 윈도우즈
- 자료구조
- JavaScript
- WebProgramming
- OOP
- algorithm
- 투자
- Call-by-reference
- meta
- API
- CSS
- query
- function
- 노드
- jsp
- array
- 포인터
- windows
- c++
- Kafka
- System
- HTML
- UTF-8
- 악성코드
- C
- CLASS
- request
- Today
- Total
hahahia
쉬프트 연산( << , >> ) 본문
음 보통 알고리즘 문제 풀거나 계산을 많이 하는 과정에서 *2를 하거나 /2를 하는 계산이 꽤나 많이 있는데....(2의 n승 전부)
보통은 a *= 2, 또는 a /= 2 이런식으로 곱하기 나누기를 하지만 사실은 그것보다 더 시간을 빠르게 사용하여 계산을 할 수 있다.
그것이 바로 쉬프트연산!!!!!!!!!
간단하게 숫자 5로 예를 들어보겠습니다. 숫자 5를 2진수로 나타내면(8bit)
0 |
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, .....)의 곱셈 나눗셈 연산을 이러한 쉬프트 연산을 이용해서 더 빠르게 계산할 수 있겠습니다.ㅎㅎ
'Algorithm' 카테고리의 다른 글
c++ string을 이용한 2진수에서 10진수 변환 프로그램 (2) | 2012.10.04 |
---|---|
더블릿 문제풀이(최대 구간 구하기) (0) | 2012.10.04 |
Selection Sort(선택 정렬) (2) | 2012.04.06 |
merge sort(병합 정렬) (0) | 2012.03.23 |
insertion sort(삽입정렬) (0) | 2011.06.05 |