OneDev

[C] 7. 연산자(2) - 비트연산자 본문

Language/C

[C] 7. 연산자(2) - 비트연산자

one_dev 2022. 7. 14. 16:22

연산자 중의 하나인 비트연산자에 대해 알아보자.

비트연산자는 비트(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
Comments