C언어 수업정리/3월 수업정리

3월 25일 연산자와 비트연산자/

송시혁 2013. 3. 25. 11:29

 

연산자 &&

비트연산자&

예) 172&&106  참일때 1.

172&106 참일때 40.

172 =   1 0 1 1 1 1 0 0

106 =   0 1 1 0 1 0 1 0

               0 0 1 0 1 0 0 0

한 자리씩 따진다.

 

a ^b =  xor 이건 알고 있으므로 생략

틸트 ~ 1의 보수를 취하는 것.

172 = 1 0 1 0 1 1 0 0

-172 = 0 1 0 1 0 0 1 1

shift 연산자.

172>> 1칸 오른쪽으로 이동

1 0 1 0 1 1 0 0

0 1 0 1 0 1 1 0

1칸씩 오른쪽으로 이동하였다. 그래서 출력은 83이 나온다.

이런식으로 8칸까지 모두 이동해본다.

1칸이동  = 86

2칸이동 =  43

3칸이동 = 21

4칸이동 = 10

5칸이동 = 5

6칸이동 = 2

7칸이동 = 1

8칸 이동 = 0

172를 2로 8번 나눈것이다.

아래는 관련 소스

#include <stdio.h>
int main()
{
  int inum1;
  int inum2;
  int inum3;
  int inum4;
  int inum5;
  int inum7;
  unsigned int uinum8;

  
  inum1 = (172&&106);
  inum2 = (172&106);
  inum3 = (172^106);
  inum4 = ( char)(83);
  inum5 = 172>>1;
  inum7 = -1;
  uinum8 = -1;

  printf("논리연산자= %d\n", inum1);
  printf("비트연산자= %d\n", inum2);
  printf(" xor비트연산자= %d\n", inum3);
  printf("~연산자= %d\n", inum4);
  printf("~연산자= %08x\n", inum4);
  printf("~연산자= %d\n", inum5);
  printf("<<연산자= %d\n"172<<1);
  printf("%08x\n", inum7); // 최대값이 -1
  printf("%08x\n", uinum8);

  printf("%08x\n", inum7>>1);  
  printf("%08x\n", uinum8>>1);
  return 0;
}


아래 구문을 유의하자.

printf("%08x\n", inum7); // 최대값이 -1
  printf("%08x\n", uinum8);

  printf("%08x\n", inum7>>1);  
  printf("%08x\n", uinum8>>1);

 

 

inum7, inum8이 -1이지만, inum7인경우 unsigned를 지정하지 않았기에 컴퓨터가  1칸 shitf 연산하면 차이가 난다.

아래 출력을 비교하자.

 inum7= ffffffff

inum8 = 7fffffff