쉬프트 연산
좌항이 int형일 경우에 << 는 논리 쉬프트이며 >>는 산술 쉬프트입니다.
좌항이 unsigned일 경우에는 << 과 >> 모두 논리 쉬프트입니다.
아래 디스어셈블리 창을 참고하세요. (s는 쉬프트,h은 논리, a는 산술 , l은 좌측, r은 우측)
shl : 좌측논리쉬프트, sar:우측산술쉬프트, shr:우측논리쉬프트
즉, 차이는 우측 쉬프트연산에서 차이가 발생하게 됩니다.
논리 쉬프트는 빈 자리를 0으로 채웁니다.
산술 쉬프트는 빈 자리를 부호비트로 채웁니다.
예제를 통해 풀어봅시다. int fun1(unsigned word) int fun2(unsigned word)
127은 이진수로 표기하면 0000 0000 0000 0000 0000 0000 0111 1111와 같습니다. 이를 24비트 좌측 쉬프트를 하면 fun1이나 fun2나 모두 0111 1111 0000 0000 0000 0000 0000 0000 이 되며 다시 24비트 우측 쉬프트를 하면 fun1의 경우 논리 쉬프트이기 때문에 빈자리는 0으로 채워져 다시 0000 0000 0000 0000 0000 0000 0111 1111 이 됩니다. 즉, 127 fun2의 경우 산술 쉬프트인데 부호비트가 0이기 때문에 빈자리는 0으로 채워져 fun1과 마찬가지로 다시 0000 0000 0000 0000 0000 0000 0111 1111 이 됩니다. 즉, 127
255의 경우는 이진수로 표기하면 0000 0000 0000 0000 0000 0000 1111 1111와 같습니다. 이를 24비트 좌측 쉬프트를 하면 fun1이나 fun2나 모두 1111 1111 0000 0000 0000 0000 0000 0000 이 되며 다시 24비트 우측 쉬프트를 하면 fun1의 경우 논리 쉬프트이기 때문에 빈자리는 0으로 채워져 다시 0000 0000 0000 0000 0000 0000 1111 1111 이 됩니다. 즉, 255 fun2의 경우 산술 쉬프트인데 부호비트가 1이기 때문에 빈자리는 1로 채워져 fun1과 다르게 1111 1111 1111 1111 1111 1111 1111 1111 이 됩니다. 즉, -1 |
보너스
부호있는 수를 표현하는 방법 중에 2의 보수를 이용하는 방법에 대한 설명입니다.
일단 맨 상위 비트가 0이면 양수 1이면 음수입니다.
양수의 경우 나머지 비트는 크기를 나타냅니다.
음수의 경우는 2의보수를 취한 것에 해당하는 수에 -부호만 붙습니다.
2의 보수는 1의 보수를 취한 수에 1을 더하면 2의 보수가 됩니다.
즉, 1100의 1진 보수는 0011 이므로
1100의 2진 보수는 0100 이 됩니다.
예를 들어 4비트를 가지고 부호있는 수를 2진 보수로표현한다면 다음과 같습니다.
0000 | 0 | 1000 | -8 |
0001 | 1 | 1001 | -7 |
0010 | 2 | 1010 | -6 |
0011 | 3 | 1011 | -5 |
0100 | 4 | 1100 | -4 |
0101 | 5 | 1101 | -3 |
0110 | 6 | 1110 | -2 |
0111 | 7 | 1111 | -1 |
1000은 짝이 되는 양의 수가 없습니다.
규칙성에 따라 -8로 정의를 하고 있습니다.
즉, 정수에서 8바이트 모두 1로 채워진 수인
1111 1111 1111 1111 1111 1111 1111 1111
는 -1로 취급되는 것입니다.
'언어 자료구조 알고리즘 > C언어 예제' 카테고리의 다른 글
정보 올림피아드 (0) | 2009.08.19 |
---|---|
중복되지 않게 랜덤한 카드 발생 (0) | 2009.08.19 |
파이, e, sin 구하기 (0) | 2009.08.19 |
Sin함수 만들기(II) (0) | 2009.08.19 |
적분 공식을 이용한 Sin(x)함수 만들기 (0) | 2009.08.19 |
정보올림피아드 프로그래밍 (0) | 2009.08.19 |
간단하게 Random함수 만들기 (0) | 2009.08.19 |
재귀함수 형상화 (0) | 2009.08.19 |
한글 초성 알아내기 (0) | 2009.08.19 |
비쥬얼 c++ 틀린부분점 ㅠ (0) | 2009.08.19 |