1.비트연산자
비트연산자에는 비트 논리 연산, 비트 시프트 연산이 있다.
비트 논리 연산 : 비트끼리 AND, OR, XOR, NOT 연산
연산자 | 의미 | 설명 |
& | 비트 AND | 두 피연산자의 해당 비트가 모두 1이면 1, 아니면 0 |
| | 비트 OR | 두 피연산의 해당 비트 중 하나만 1이면 1 |
^ | 비트 XOR | 두 연산자의 해당 비트가 같으면 0, 다르면 1 |
~ | 비트 NOT | 0을 1로 만들고 1을 0으로 만듦 |
비트 시프트 연산 : 비트를 오른쪽이나 왼쪽으로 이동하는 연산 (빈 자리는 0으로 채움)
연산자 | 의미 | 설명 |
<< | 왼쪽으로 이동 | 지정된 개수만큼 모든 비트를 왼쪽으로 이동 |
>> | 오른쪽으로 이동 | 지정된 개수만큼 모든 비트를 오른쪽으로 이동 |
-비트 논리 연산
연산자 | 의미 | 설명 |
& | 비트 AND | 두 피연산자의 해당 비트가 모두 1이면 1, 아니면 0 |
| | 비트 OR | 두 피연산의 해당 비트 중 하나만 1이면 1 |
^ | 비트 XOR | 두 연산자의 해당 비트가 같으면 0, 다르면 1 |
~ | 비트 NOT | 0을 1로 만들고 1을 0으로 만듦 |
예를 들어, 8 & 10을 계산하려한다면,
8=1000$_2$, 10= 1010$_2$이므로
1000
&1010
-------
1000
따라서 8&10 == 8이 된다.
자세한 이해는 위의 사진을 참조하자.
-비트 시프트 연산
연산자 | 의미 | 설명 |
<< | 왼쪽으로 이동 | 지정된 개수만큼 모든 비트를 왼쪽으로 이동 |
>> | 오른쪽으로 이동 | 지정된 개수만큼 모든 비트를 오른쪽으로 이동 |
비트 시프트 연산도 위에서의 비트 논리연산과 마찬가지로 2진수에서의 계산이다.
예를 들어, 8<<2는 8의 비트를 왼쪽으로 2번 밀겠다는 설명이다.
즉, 8 = 1000$_2$이므로
8<<2를 해주면,
1000$_2$ -> 100000$_2$ 이 되고,
8<<2는 32가 된다.
오른쪽으로 밀어주는 것도 마찬가지의 원리이다. 또한 오른쪽으로 밀려서 사라지는 숫자는 신경쓰지 않는다.
따라서 왼쪽으로 미는 시프트 연산은 피연산자를 2배 해준것이고, 오른쪽으로 미는 시프트 연산은 2로 나눈 값이다(물론 나머지는 남지않는다)
비트 시프트 연산에 대응되는 산술연산은 이러하다.
n << p는,
$n×2^p$의 결과이며,
n >> p는
n/2 (int연산이라 나머지가 남지않음)를 p번 해준결과이다.
#include <stdio.h>
int main(){
printf("%d",6 << 1); //12
printf("%d",6 >> 2); //1
printf("%d", 6 & 5); //110 & 101 == 100, 4
printf("%d", 6 | 5); //110 | 101 == 111, 7
printf("%d", 6 ^ 5); //110 ^ 101 == 011, 3
return 0;
}
-비트 논리 NOT연산자에 대한 주의
100이라는 정수가 있을 때, not연산자를 씌우면 어떻게될까?
100은 그 자체로 (signed) int형이므로 8비트짜리 공간이 4개 있을 것이다.
100 -> 00000000 00000000 00000000 01100100
따라서 ~100 -> 11111111 11111111 11111111 10011011 이다.
그러나 맨앞의 비트가 부호를 담당하는 비트이며 0은 양수, 1은 음수를 의미한다.
따라서 ~100은 예상한 0011011$_2$, 51이 아닌 -101이 나온다.
음수계산에 대한 자세한 내용은 2의 보수에 대한 내용을 참조하자.
결과적으로, 어떤 정수x에 대한 NOT인 ~x는 -(x+1)로 도출된다.
-2.연산자의 우선순위
연산자의 우선순위는 다음과 같은 순서로 진행된다.
우선 괄호가 가장 먼저 진행된다. (항상 모든 연산자보다 우선으로 진행)
다음으로 증감과 같은 단항연산이 진행되고, 산술연산과 비트시프트연산(사실상 산술연산)이 진행된다.
그 다음으로는 관계연산, 바로 다음으로는 논리연산과 비트논리연산이 실행되며
마지막으로는 조건, 대입연산과 복합대입연산, 콤마가 실행된다.
정리하자면, 대강 괄호 -> 단항연산 -> 산술연산 -> 관계연산 -> 논리연산 -> 대입연산 순으로 진행된다.
그러나 순서가 헷갈리지 않게 괄호를 이용해 순서를 지정해주는 방법이 가장 직관적이라고 생각한다.
'CS > C언어' 카테고리의 다른 글
[C언어] 6. 반복문(1) -while문, for문 (0) | 2024.06.06 |
---|---|
[C언어] 5. 선택문(1) - if문 (1) | 2024.06.05 |
[C언어] 4. 연산자(1) - 산술, 대입, 복합대입, 증감, 관계/논리, 조건 (0) | 2024.06.04 |
[C언어] 3. 자료형(2) - 실수, 형 변환 (0) | 2024.06.04 |
[C언어] 3. 자료형(1) - 정수, 상수, 문자 (0) | 2024.06.03 |