티스토리 뷰
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 |
- Total
- Today
- Yesterday
- PHP'"
- html이미지넣기
- HTMLtag사용법
- 무효트래픽이의신청
- PHP큰따옴표작은따옴표차이점
- C언어동적메모리할당
- PHP"'
- htmlTag
- HTMLbestTag
- PHPescapecharacter
- 무효클릭신고양식
- C언어malloc함수
- C언어malloc
- PHP'
- html이미지
- C언어2차원포인터
- C언어다차원포인터
- PHPescaping
- 이미지무료다운로드사이트
- PHP이스케이프
- PHP이스케이핑
- PHP마침표
- C언어프로세스
- C언어정적메모리할당
- PHP작은따옴표
- HTML태그사용법
- PHP작은따옴표역할
- PHP문자열연결연산자
- PHP큰따옴표
- PHPhere문서
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |