와드의 블로그

10. 시프트 연산자와 비트 연산자 본문

프로그래밍 언어/C

10. 시프트 연산자와 비트 연산자

Ward 2021. 9. 12. 04:01

(1) 비트 단위 연산과 비트 패턴

 

* 비트 단위 연산자가 필요한 이유

프로그램이 다루는 데이터 중에 두 가지 상황 중 한 가지를 선택하거나 저장하는 경우가 많아서 비트 단위 연산자가 필요하다.

 

* 비트 패턴과 16진법

C 언어는 2진법 상수 표현을 제공하지 않아서 소스 코드에서는 2진법으로 변환하기 쉬운 16진법을 사용한다. 

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