티스토리 뷰

C언어 반복문/시프트 연산자/비트 연산자

C언어 반복문/시프트 연산자/비트 연산자 요약이다. Do it! C언어 입문(저자:김성엽) 이란 책을 통해 공부했으며, 책의 카테고리를 바탕으로 필자가 이해한 내용을 요약하는 글이다. 내용이 궁금하거나 찾아야 할 내용이 있으면, 필자가 정리한 글을 다시 보면서 복습하기위해 작성했다. 바로 아래에서 글을 확인하도록 하자.

 

반복 작업에 필요한 세 가지 요소

시작 조건, 종결 조건, 조건 변화 수식

 

for 반복문의 기본 구조

for(시작 조건; 종결조건; 변화 수식) 명령문; /* 단일 문장으로만 사용 가능 */

for(시작 조건; 종결 조건; 변화 수식){ /* 복합 문장 사용 가능 */
명령문1;
명령문2;
}

for( 시작 조건1, 시작 조건2; 종결 조건; 변화 수식) 명령문;
/* 시작 조건에 ','를 쓰면 여러개 넣을 수 있음 */

for(;;) 명령문; /*무한 루프임 break;를 통해 빠저나올 수 있음*/

for( ;종결 조건;변화 수식) 명령문; /* main 함수에서 초기조건을 주면 이렇게 할 수 있음 */

for( ; 종결 조건; ) 명령문;
/* 변화 수식을 for문 안에 주면 할 수 있음, while문과 차이가 없음 */

 

while 반복문의 기본 구조

/* 종결 조건이 참이면 실행, 거짓이면 while문 끝 */

while(종결 조건) 명령문; /* 단일문 사용 가능 */

while(종결 조건){ /* 복합 문장 사용 가능 */
명령문1;
명령문2;
}

while(1){ /* 무한 루프 */
명령문;
}

 

do ~ while 반복문

do 명령문; while(종결 조건);

do{
명령문1;
명령문2;
}while(종결 조건);
/*일단 명령문을 최소 1번은 실행하고, 그후에 종결 조건이 거짓이면 끝 */

 

break와 continue 제어문

break;는 반복문 종료시킴.
continue;는 바로 조건 변화 수식으로 감. 그 이후 종결 조건을 체크한 후 진행.

 

goto문

for(m=5; m<7; m++){
if(m==6) goto GAJA;
printf("%d",m); /* goto GAJA;에서 GAJA : 로 바로 이동함. */
}
GAJA :
printf("GAJA로 왔음");

 

시프트 연산자

unsigned char data = 0x1A;
/* 이동전 : 0001 1010 */

data = data << 2;
/*왼쪽으로 2칸 이동하니까 : 0110 1000 */

data = 0x1A;
/* 이동전 : 0001 1010*/

data = data >> 2;
/* 오른쪽으로 2칸이동 : 0000 0110 */

없던 자리수는 0으로 다시 채움.
왼쪽으로 이동해서 사라지는 거 = 오버플로(Overflow)
오른쪽으로 이동해서 사라지는 거 = 언더플로(Underflow)

 

시프트 연산자의 특성

10진수 16 8 4 2 1
2진수 0001 0000 0000 1000 0000 0100 0000 0010 0000 0001

<<2 : 2^2으로 곱한 거랑 같음
>>2 : 2^2으로 나눈 거랑 같음. (곱하기랑 나눗셈 대체할 수 있음)

※주의할 점
1. 시프트 연산자 우선순위가 낮음.() 괄호 잘 이용해서 하면 됨.
2. 변수에 부호가 있는 경우
1) 앞의 부호가 1이면 >>를 했을 때 빈자리에 1이 채워 저서 다른 값이 됨.
2)>>3으로 연산하고 싶으면 8(2^3)의 배수인지 확인하고 실행해야 함. 아니면 값이 다름.(1만큼 더 적은 값이 나옴)

 

비트 연산자

A B AND(&) OR(|) XOR(^) NOT(~)
0 0 0 0 0 1
0 1 0 1 1
1 0 0 1 1 0
1 1 1 1 0

 

AND(&) 연산

   0000 1111 (0X0F)
& 0011 1100 (0X3C)
----------------------------
   0000 1100 (0X0C)

 

OR(|) 연산

   0000 1111 (0X0F)
|  0011 1100 (0X3C)
----------------------------
   0011 1111 (0X3F)

 

XOR(^) 연산

   0000 1111 (0X0F)
^ 0011 1100 (0X3C)
-----------------------------
   0011 0011 (0X33)

 

NOT(~) 연산

~0000 1111 (0X0F)
--------------------------
  1111 0000 (0XF0)

 

비트 연산자 단축 표현

기본 표현 단축 표현
A=A&B; A&=B;
A=A|B; A|B;
A=A^B; A^=B;

 

지정한 비트를 0으로 설정하기

unsigned char lamp_state;

unsinged char bit_num = 2; /* 2번 비트를 0으로 지정하고싶음 */

unsigned char mask = ~(0x01 << bit_num); /* 나머지는 1 원하는곳은 0 */

lamp_state = lamp_state & mask; /* 2번 비트만 0으로 바뀜 나머진 그대로 */
#include <stdio.h>
unsigned char ResetBit(unsigned char dest_data, unsigned char bit_num)
{ /* 8비트라 bit_num은 0~7 임 */
if(bit_num < 8) dset_data = dest_data & ~(0x01 << bit_num);

return dest_data;
}

void main()
{
unsinged char lamp_state = 0x7F;
printf("&X ->", lamp_state);

lamp_state = resetBit(lamp_state, 3); /* lmap_state의 3번 비트를 0으로 바꿔달라 */
printf("&X\n",lamp_state); /* 3번 비트만 0으로 바뀜 */ }
/* 결과 : 7F -> 77 */

 

지정한 비트를 1로 설정하기

unsigned char lamp_state;
unsigned char bit_num = 2;
lamp_state = lamp_state | (0x01 << bit_num); /* 2번비트를 1로 설정 */
#include <stdio.h>
unsigned char SetBit(unsigned char dest_data, unsigned char bit_num)
{
if(bit_num <8) dest_data = dest_data | (0x01 << bit_num);
return dest_data;
}

void main()
{ unsigend char lamp_state = 0x77;
printf("%X ->", lamp_state);

lamp_state = SetBit(lamp_state,3);
printf("%X\n", lamp_state); /* 3번 비트 1로 바뀜 */
} /* 결과 : 77 -> 7F */

 

특정 비트의 값 얻기

unsigned char lamp_state; /*무슨 값 있는지 모름 */
unsigned char bit_num=2; /* 2번 비트를 알고 싶음 */
unsigned char bit_state; /* 2번 비트 잠시 저장 */
unsigned char mask = 0x01 << bit_num;
bit_state = lamp_state & mask; /* 2번비트에 0인지 1인지 비트는 들어있지만 그 값이 4임*/
bit_state = bit_state >> bit_num; /*다시 0번비트로 옮겨서 그 값이 0인지 1인지 확인 가능*/

 

비트 연산자를 활용하는 방법

A-B 이거랑 똑같은 거는 A+(B의 2의 보수) 임.

B의 1의 보수 = ~B
B의 2의 보수 = ~B +1

 

데이터 암호화하기

0 1 0 1 0 1 1 0 0x56(원본)
0 0 1 1 0 1 1 1 0x37(암호)
0 1 1 0 0 0 0 1 0x61(암호화된 데이터)
0 0 1 1 0 1 1 1 0x37(암호)
0 1 0 1 0 1 1 0 0x56(원본)

위에서 아래 방향으로 XOR(^)를 하면 암호화된 데이터를 만들 수 있고 받는 사람은 다시 암호 데이터로 XOR(^)하면 원본을 만들 수 있음. 이렇게 간단하게 XOR(^)를 이용해서 암호화할 수 있음.
암호 데이터의 비트를 늘리면 더욱 보안성을 높일 수 있음.

 

글을 마음대로 배포하셔도 되지만, 출처(링크)는 반드시 남겨주시기 바랍니다.

'C언어' 카테고리의 다른 글

C언어 배열  (0) 2021.03.12
C언어 지역 변수/전역 변수  (0) 2021.03.12
C언어 연산자/조건문  (0) 2021.03.11
C언어 함수/표준출력함수  (0) 2021.03.11
C언어 자료형/상수  (0) 2021.03.10
댓글