관리 메뉴

History

시프트 연산자와 비트연산자 실습 본문

C,C++/개념 실습 프로그래밍

시프트 연산자와 비트연산자 실습

luckybee 2022. 11. 20. 18:36
728x90
반응형

지금까지 개념을 설명하면서 쌓아온 실력을 실습해보는 시간이다. 아래 코드는 자신이 원하는 비트 번지를 0으로 바꿀 수 있는 함수이다.

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;  //16진수의 숫자
	printf("%X->",lamp_state);   
	lamp_state = ResetBit(lamp_state, 3); //3번째 비트를 0으로 바꾸겠다.
	printf("%X\n", lamp_state);           //3번째 비트가 0으로 바뀐 결과 값 도출

}

위의 코드만 보면 함수 부분이 헷갈릴 것이다. 어떻게 진행되는지 아래 부연설명을 진행하겠다.

 

0x01 << bit_num                ->  0000 1000
~(0x01 << bit_num)             ->  1111 0111  
dest_data & ~(0x01 << bit_num) 
  1111 0111
& 0111 1111
-----------
  0111 0111 ->77

 

두 번째 예제이다. 이번 예제는 자신이 원하는 비트 번지를 1로 세팅하는 코드를 작성해 보겠다.

unsigned char SetBit(unsigned char dest_data, unsigned char bit_num)
{
	if (bit_num < 8) {
		dest_data = dest_data |(0x01 << bit_num);  //원하는 비트번지를 1로 바꿈
	}
	return dest_data;
}

int main()
{
	unsigned char data = 0x77;
	printf("%X->", data);
	data = SetBit(data, 3);
	printf("%X\n", data);

}

아래는 함수의 부연 설명이다.

0x01 << bit_num 			-> 0000 1000 
dest_data |(0x01 << bit_num) 
 0000 1000 
|0111 0111
----------------
 0111 1111 ->7F

마지막 예제이다.  이 예제는 어떠한 16진수를 2진법으로 바꾸는 함수이다. 

 

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 data = 0x75;
	unsigned char bit_state;
	int i;
	printf("%X->", data);
	for ( i = 0; i < 8; i++){  //전체 비트를 바꾸기 위해 반복문 8번을 돌린다.
		bit_state = GetBit(data, 7 -i); //최종 비트는 7이므로
		printf("%d", bit_state);
	}
	printf("\n");
}

아래는 함수의 부연설명이다.

0111 0011 ==0x75

 0000 0001 << 7

 1000 0000
&0111 0101
----------------
 0000 0000       -->0
 
 
 0000 0001 << 6

 0100 0000
&0111 0101
----------------
 0100 0000       -->1


 0000 0001 << 5


 0010 0000
&0111 0101
----------------
 0010 0000      -->1

 0000 0001 << 4

 0001 0000
&0111 0101
----------------
 0001 0000      -->1

 0000 0001 << 3

 0000 1000
&0111 0101
----------------
 0000 0000      -->0


 0000 0001 << 2

 0000 0100
&0111 0101
----------------
 0000 0000      -->1

 0000 0001 << 1

 0000 0010
&0111 0101
----------------
 0000 0010      -->0

 0000 0001 << 0
 
 0000 0001
&0111 0101
----------------
 0000 0001      -->1
728x90
반응형
Comments