OneDev
[C] 7. 연산자(2) - 비트연산자 본문
연산자 중의 하나인 비트연산자에 대해 알아보자.
비트연산자는 비트(bit) 하나하나에 대해 연산을 하는 연산자이다.
(Recall : 비트 = 컴퓨터에서 숫자의 최소 단위 / 1비트는 0또는 1을 나타냄)
이렇게 설명하면 무슨말인지 잘 와닿지 않을 확률이 높기때문에
일단 비트연산자에 어떤것들이 있는지 살펴보도록 하자.
1. AND 연산(&)
AND 연산은 아래와 같은 규칙을 통해 연산되는데, 집합론 초반 명제에 대해 배울때 사용했던 truth table과 유사한 형태를 띄고 있으니 수학을 전공하신 분들이라면 직관적으로 이해하실 수 있을 듯 하다.
연산 | 결과 | ||
1 | & | 1 | 1 |
1 | & | 0 | 0 |
0 | & | 1 | 0 |
0 | & | 0 | 0 |
비트연산은 각 자리를 연산한다.
아래는 예시로 1010 & 0011 의 연산 과정을 나타낸 것이다.
1 | 0 | 1 | 0 | |
0 | 0 | 1 | 1 | |
& | ↓ | ↓ | ↓ | ↓ |
결과 | 0 | 0 | 1 | 0 |
위의 예 처럼 각 자리마다 위의 표에 나와있는 규칙대로 연산하여 결과를 낸다.
만약 연산하는 두 수의 자릿수가 맞지 않을 경우, 자릿수가 낮은 수 앞에 0을 부족한 만큼 추가해주어 자릿수를 맞춰준다.
예를 들어 11110 과 11을 연산해야 할때는, 11을 표기만 바꾸어 00011로 연산해주면 된다.
2. OR 연산 ( | )
OR 연산은 AND연산과 비슷하지만 다르다.
AND 연산은 두 값이 모두 참일때만 참을 반환한다면, OR 연산은 두 값중 하나만 참이라면 참을 반환한다.
아래의 표는 OR 연산의 규칙을 표로 나타낸 것이다.
(OR 연산의 기호 | 는 Shift + \ (또는 ₩) 로 타이핑 할 수 있다.)
연산 | 결과 | ||
1 | | | 1 | 1 |
1 | | | 0 | 1 |
0 | | | 1 | 1 |
0 | | | 0 | 0 |
3. XOR 연산(^)
OR 연산이 하나만 참이어도 참을 반환했던 것과 달리, XO연산(^)은 두 값이 달라야지만 1을 반환한다.
연산 | 결과 | ||
1 | ^ | 1 | 0 |
1 | ^ | 0 | 1 |
0 | ^ | 1 | 1 |
0 | ^ | 0 | 0 |
4. 반전연산(~)
명제에서 ~p 가 not p를 의미했음을 떠올리면 이해가 쉬울듯 하다.
반전연산은 말 그대로 0을 1로, 1을 0으로 바꿔주는 연산이다.
ex) ~ 1101 = 0010
5. << 연산(쉬프트 연산)
<< 연산은 비트를 왼쪽으로 쉬프트(이동) 시킨다.
예를 들어 101011 을 1만큼 쉬프트 시키는 경우를 보자.
(a= 101011이라 하면 이를 a << 1 로 표기한다)
1 | 0 | 1 | 0 | 1 | 1 | |
↙ | ↙ | ↙ | ↙ | ↙ | ↙ | ↙ |
1 | 0 | 1 | 0 | 1 | 1 | 0 |
<< 쉬프트 시 앞에 쉬프트 된 숫자가 갈 자리가 없다면 그 부분은 버려진다.
또한 새로 채워지는 부분은 0으로 채워진다.
101011을 왼쪽으로 1만큼 쉬프트시키면 010110이 된다(표에서 빨간색으로 표시한 값)
6. >> 연산
>> 연산은 <<연산과 비슷하게 비트를 오른쪽으로 쉬프트 시킨다.
오른쪽으로 쉬프트 할 떄, 숫자가 갈 자리가 없다면 그 부분은 버려진다.
이 때, 무조건 0이 채워지던 << 연산과는 달리 앞부분 맨 왼쪽에 있던 수로 채워지게 된다.
ex) 11100010 >> 3 = 11111100
00011001 >> 3 = 00000011
지금까지 여러 연산자에 대해 알아보았는데, 보통 연산자를 하나만 쓰는 경우보다는 여러가지 연산자를 섞어 쓰는 경우가 훨씬 많다.
여러가지 연산자가 복잡하게 섞여있다면 어떤 순서대로 연산을 해야될까?
이 질문에 대한 대답은 연산자 우선순위에 따라 하면 된다 이다.
연산자 우선순위는 아래의 표에 나와있는 대로이다.
'Language > C' 카테고리의 다른 글
[C] 9. 입력받기(scanf 함수) (0) | 2022.07.19 |
---|---|
[C] 8. 오버플로우(overflow) (0) | 2022.07.15 |
[C] 6. 연산자(1) -산술연산자/대입연산자/복합대입연산자 (0) | 2022.07.14 |
[C] 5. 변수(Variables) (0) | 2022.07.05 |
[C] 4. 주석 (0) | 2022.06.28 |