본문 바로가기

프로그래밍 언어들/C

6장 - C언어 연산자(Operators)(2)

6장 - C언어 연산자(Operators)(2)


1. 비트 연산자(Bitwise operators)

비트 연산자는 연산하려는 수의 비트 단위에서 처리가 이루어집니다.


  ~

NOT 연산(비트 반전)

 &

 AND 연산

 |

 OR 연산

 ^

 XOR 연산

 >> a

 비트를 우로 a만큼 이동

 << b

 비트를 좌로 b만큼 이동


실습에 앞서 10진수 10과 8에 대해 예를 들자면, 10진수 10은 2진수로 1010(2)이고

8은 2진수로 1000(2) 입니다.

(1) 두 수 10과 8을 & 연산을 할 경우

두 부호가 모두 1이어야 1이 됩니다.

1010

1000

_______

1000(2)이 됩니다.

즉, 10 & 8의 결과 값은 8이 나오게 됩니다.


(2) 두 수 10과 8을 | 연산을 할 경우

두 부호 중 하나만 1이어도 1이 됩니다.

1010

1000

______

1010(2)이 됩니다.

즉, 10 | 8의 결과 값은 10이 나오게 됩니다.


(3) 두 수 10과 8을 ^ 연산을 할 경우

부호가 달라야 1이 됩니다.

1010

1000

______

0010(2)이 됩니다.

즉 10 ^ 8의 결과 값은 2가 나오게 됩니다.


 
  1. #include <stdio.h>
  2.  
  3. int main( void)
  4. {
  5.     char a = 10;
  6.     char b = 8;
  7.  
  8.     printf("a & b = %d\n", a&b);
  9.     printf("a | b = %d\n", a|b);
  10.     printf("a ^ b = %d\n", a^b);
  11. }
  12.  


앞서 설명한 내용을 소스코드로 작성한 것입니다. 위의 소스코드를 실행해보시길 바랍니다.

line.5-6을 보시면 변수를 char형으로 선언을 했습니다. 그 이유는 char형 변수가 앞에서

학습한 것처럼 1byte을 크기를 가집니다. 1byte = 8bit로 8비트의 표현이 가능합니다.

int형의 경우 4byte이므로, 총 32bt의 표현이 가능합니다. 그러나 사용하려는 비트 수가

4자릿수 이하인데 int형으로 선언하는 것보다 효율적이기 때문에 char형으로 선언하였습니다.


다음은 ~(NOT) 연산자와 >>, <<(쉬프트) 연산자에 대해서 알아보겠습니다.

(4) ~ (NOT) 연산

NOT 연산은 말 그대로 부호를 반전 시키는 연산자입니다.

10진수 10의 경우 2진수로 1010(2)이 됩니다. 해당 비트를 반전 시킬 경우에 0101(2)이 됩니다.

그렇다면 C언어에서 ~10 연산을 할 경우 3 (0101(2))의 값이 나올까요?

정답은 "아니다" 입니다.

그 이유는 앞에서 설명드린 것과 같이 최상위 비트를 부호비트로 사용이 됩니다.

즉, 8비트 변수의 경우 10진수 10을 표현하면 아래와 같습니다.


 0

 0


가장 왼쪽에 있는 최상위 비트가 부호 비트로서 0이면 양수를 뜻합니다.

여기서 만약 ~ 연산을 하게 된다면 다음과 같습니다.


 1

1


즉, 부호비트까지 토글이 되어버립니다. 부호비트가 1이면 음수를 뜻합니다.

그러므로 위의 8비트는 음수를 뜻하게 되는겁니다. 위의 수를 알아보기 위한 간단한 방법으로는

8비트 11111111(2) 경우 -1 입니다. 많은 분들이 -1은 10000000(2)로 착각하시는 경우가 있는데,

10 진수 1에 대해서 음수로 표현하기 위해 2의 보수를 취하면 아래와 같습니다.

00000001(2)

11111110(2) 1의 보수

11111111(2) 2의 보수

즉, -1의 비트는 11111111(2)이고, 여기서 다른 음수를 알아보기 위해서는 다시 2의 보수를 취하지 않고

0의 자릿수만큼 더 빼주시면, 해당 음수가 나옵니다.

11110101(2) 의 경우

0인 비트의 수, 즉 10진수 8의 자리와 2의 자리가 0이므로

-1에서 10 만큼을 더 빼주면, 해당 비트의 음수가 표현이 됩니다.

즉, -1 - 10 = -11이 되는 것입니다.


(5) >>, << (쉬프트) 연산

쉬프트 연산은 좌 또는 위로 a 만큼 비트를 이동시키는 것입니다.

8 >> 2를 예로 들어보면, 10진수 8의 비트는 1000(2)입니다. 이것을 우측으로 2번 이동시키면

0010(2)이 됩니다.

8 << 1도 마찬가지로, 1000(2) 비트를 좌로 1번 이동시킨다는 의미로서 10000(2)가 됩니다.


 
  1. #include <stdio.h>
  2.  
  3. int main( void)
  4. {
  5.     char a = 10;
  6.     char b = 8;
  7.  
  8.     printf("%d\n", ~a);
  9.     printf("%d\n", ~b);
  10.     printf("%d\n", a << 2);
  11.     printf("%d\n", b >> 2);
  12. }
  13.  


앞에서 설명한 내용을 소스코드로 작성한 것입니다. 실습해보면서 더욱 더 이해를 굳히시길 바랍니다.


2. 실습 문제

(1) 입력받은 세자리 수를 거꾸로 출력하라. ( 입력 : 123 > 출력 : 321 )

(2) 물건 가격과 지불 금액을 입력받고, 거스름돈에 대해서 5000원, 1000원, 500원, 100원, 10원, 1원을

각각 얼마씩 줘야하는지 계산하라.

ex) 물간가격 12500원, 지불 금액 20000원

= 거스름돈 7500원 ( 5천원 1장, 천원 2장, 500원 1개, 100원 0개, 10원 0개, 1원 0개 )

(3) 입력받은 두 정수를 (-) 연산자를 사용하지 않고 뺄셈을 하라.

 

※ 정답은 아래 링크

http://leeyongjeon.tistory.com/category/프로그래밍%20언어들/C%20문제풀이