- 비트 연산자
- 비트 연산과 논리 연산의 차이
- 쉬프트 연산자
비트 연산자에는 이항 연산자인 &, | 와 단항 연산자인 ~, ^ 가 있다.
쉬프트 연산자에는 이항 연산자인 <<, >> 가 있다.
비트 연산자와 쉬프트 연산자는 공통적으로 비트 단위의 연산을 한다는 공통점이 있다.
논리 연산은 먼저 피연산자의 값이 참인지 거짓인지를 먼저 확인 한 후에 논리 곱 혹은 논리 합 등을 연산한다.
반면, 비트 연산은 피연산자의 비트 단위로 연산을 한다.
Look & Feel & Think
다음은 논리 연산과 비트 연산에 대한 코드를 디스 어셈블리 한 모습이다. 두 연산의 극명한 차이를 보고 느끼고 생각하라.
비트 연산에서 ^ 는 xor연산에 대한 연산 기호이며 ~는 not에 대한 연산 기호이다.
쉬프트 연산은 좌항에 값을 우항만큰 오른쪽 혹은 왼쪽으로 비트 이동을 하는 연산이다.
좌측 피연산자가 부호 있는 정수이고 >>(우측 쉬프트)연산일 경우에는 산술 쉬프트 동작을 하고 그 외에는 논리 쉬프트를 한다.
산술 쉬프트는 빈 자리를 부호 비트로 채우고 논리 쉬프트는 0으로 채우는 것을 말한다.
Look & Feel & Think
다음을 보면 좌측 피연산자가 부호 있는 정수일 때 산술 쉬프트(sar)을 하는 것을 알 수 있다.
과연 음의 수만큼 쉬프트를 하는 것은 의미 있는 것일까? 컴파일러에서는 경고는 뜨긴 하지만 에러는 아니다.
즉, 컴파일을 하기는 한다.
다음을 보면 음의 수만큼 쉬프트를 하는 것은 32 + (쉬프트 수) 만큼 쉬프트 함을 알 수 있다.
다음을 보자. 어떤 수를 34번을 왼쪽 1비트 쉬프트 하는 것과 34비트를 쉬프트 하라는 것은 연산 결과가 틀리다.
쉬프트 연산의 우항은 32로 모듈라 연산한 크기만큼만 쉬프트 한다.
이는 쉬프트 연산을 할 때에는 좌측 피연산자의 비트 크기를 초과할 수 없기 때문이다.
[발췌]ISO/IEC 9899:TC3 문서의 6.5.7 Bitwise shift operators
If the value of the right operand is negative or is
greater than or equal to the width of the promoted left operand, the behavior is undefined.
The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are filled with
zeros. If E1 has an unsigned type, the value of the result is E1 * 2^E2, reduced modulo
one more than the maximum value representable in the result type. If E1 has a signed
type and nonnegative value, and E1 * 2^E2 is representable in the result type, then that is the resulting value; otherwise, the behavior is undefined.
The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type
or if E1 has a signed type and a nonnegative value, the value of the result is the integral
part of the quotient of E1 / 2^E2. If E1 has a signed type and a negative value, the
resulting value is implementation-defined.
원하는 자리만 1로 setting하고자 할 때는 어떻게 해야 할까?
원하는 자리만 1로 clear하고자 할 때는 어떻게 해야 할까?
원하는 자리가 1인지 0인지 확인은 어떻게 해야 할까?
A에 B로 xor한 것을 C라 하자. C를 B로 xor하면 어떻게 될까?
'언어 자료구조 알고리즘 > C 언어 문법' 카테고리의 다른 글
20. 제어문 - 조건문 (0) | 2009.08.19 |
---|---|
19. 기본입출력 - 입력 (0) | 2009.08.19 |
18. 기본 입출력 - 출력 (0) | 2009.08.19 |
17.기본 입출력 개요 (0) | 2009.08.19 |
16. 지시/주소/인덱스/간접연산자 (0) | 2009.08.19 |
14. 비교/논리 연산자 (0) | 2009.08.19 |
13. 대입 연산자 (0) | 2009.08.19 |
12. 증감연산자 (0) | 2009.08.19 |
11. 산술 연산자 (0) | 2009.08.19 |
10. 연산자 (0) | 2009.08.19 |