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
반응형