| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
- 플로이드-워셜
- 코테공부
- 인접 행렬
- 운영체제
- 개발자취업
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- 개발자루틴
- 자료구조
- 파이썬
- 연결 리스트
- 자바
- 티스토리챌린지
- 코딩테스트사이트추천
- 오블완
- 데이터베이스
- 웹
- 항해99
- 자바스크립트
- 프로그래밍 언어
- til
- 프로그래머스
- 99클럽
- C
- 코딩테스트준비
- 갭체크
- 코딩테스트
- 코드트리
- Java
- 알고리즘
- 1일1코테
- Today
- Total
와드의 블로그
10. 시프트 연산자와 비트 연산자 본문
(1) 비트 단위 연산과 비트 패턴
* 비트 단위 연산자가 필요한 이유
프로그램이 다루는 데이터 중에 두 가지 상황 중 한 가지를 선택하거나 저장하는 경우가 많아서 비트 단위 연산자가 필요하다.
* 비트 패턴과 16진법
C 언어는 2진법 상수 표현을 제공하지 않아서 소스 코드에서는 2진법으로 변환하기 쉬운 16진법을 사용한다.

(2) 시프트 연산자
* 시프트 연산자의 기능
시프트 연산자(<<, >>)는 변수의 값을 지정한 비트 수만큼 왼쪽 또는 오른쪽 비트를 이동시키는 기능을 한다.
이동한 비트들이 변수를 위해 할당된 메모리 공간의 크기를 벗어나면 해당 비트들은 사라지고, 비트가 이동한 빈자리는 0으로 채워진다.
오버플로: 비트가 왼쪽에서 이동해서 사라지는 것이다.
언더플로: 비트가 오른쪽으로 이동해서 사라지는 것이다.
* 시프트 연산자의 특성 이용하기
곱셈: << 연산을 사용하여 n개의 비트를 오른쪽에서 왼쪽으로 이동하면 2^n을 곱한 것과 동일한 효과가 있다.
나눗셈: >> 연산을 사용하여 n개의 비트를 왼쪽에서 오른쪽으로 이동하면 2^n을 나눈 것과 동일한 효과가 있다.
※ 부호가 있는 변수에 시프트 연산을 하면 연산 특성이 달라지기 때문에 주의해야 한다.
(3) 비트 연산자
* 비트 연산자란?
비트 연산자: 비트 단위로 AND, OR, NOT, XOR연산을 수행한다.

* 비트 단위로 데이터를 다루는 방법
지정한 비트에만 값을 대입하면 연산자는 없기 때문에 비트 연산자의 연산 특징을 응용하여 직접 구현해야 한다.
* 지정한 비트를 0으로 설정하기
#include <stdio.h>
unsigned char ResetBit(unsigned char dest_data, unsigned char bit_num) {
if (bit_num < 8)
dest_data = dest_data & ~(0x01 << bit_num);
return dest_data;
}
int main()
{
unsigned char lamp_state = 0x7F;
printf("%x -> ", lamp_state);
lamp_state = ResetBit(lamp_state, 3);
printf("%x\n", lamp_state);
return 0;
}
* 지정한 비트를 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;
}
int main()
{
unsigned char lamp_state = 0x77;
printf("%x -> ", lamp_state);
lamp_state = SetBit(lamp_state, 3);
printf("%x\n", lamp_state);
return 0;
}
* 특정 비트의 값 얻기
#include <stdio.h>
unsigned char GetBit(unsigned char dest_data, unsigned char bit_num) {
unsigned char bit_state = 0;
if (bit_num < 8) {
bit_state = dest_data & (0x01 << bit_num);
bit_state = bit_state >> bit_num;
}
return bit_state;
}
int main()
{
unsigned char lamp_state = 0x75, bit_state;
printf("%x -> ", lamp_state);
for (int i = 0; i < 8; i++) {
bit_state = GetBit(lamp_state, 7 - i);
printf("%d", bit_state);
}
printf("\n");
return 0;
}
참조문헌: C언어 입문
'프로그래밍 언어 > C' 카테고리의 다른 글
| 12. 배열과 문자열 (0) | 2021.09.14 |
|---|---|
| 11. 지역 변수와 전역 변수 (0) | 2021.09.12 |
| 9. 반복문 (0) | 2021.09.12 |
| 8. 조건문 (0) | 2021.09.10 |
| 7. 연산자 (0) | 2021.09.10 |