문타쿠, 공부하다.
[C언어 코딩 도장] Unit 24. 비트 연산자 응용하기 본문
24.1 시프트 연산과 2의 거듭제곱 알아보기
#include <stdio.h>
int main(void)
{
unsigned char num1 = 1;
printf("%u\n", num1 << 1);
printf("%u\n", num1 << 2);
printf("%u\n", num1 << 3);
printf("%u\n", num1 << 4);
printf("%u\n", num1 << 5);
printf("%u\n", num1 << 6);
printf("%u\n", num1 << 7);
return 0;
}
24.2 시프트 연산으로 자릿수를 넘어서는 경우 알아보기
#include <stdio.h>
int main(void)
{
unsigned char num1 = 240; // 1111 0000
unsigned char num2 = 15; // 0000 1111
unsigned char num3, num4;
num3 = num1 << 2; // 1100 0000 = 192
num4 = num2 >> 2; // 0000 0011 = 3
printf("%u\n", num3);
printf("%u\n", num4);
return 0;
}
24.3 부호 있는 자료형의 비트 연산 알아보기
">>"
#include <stdio.h>
int main(void)
{
unsigned char num1 = 131; // 1000 0011
char num2 = -125; // 1000 0011
char num3 = 67; // 0100 0011
unsigned char num4;
char num5;
char num6;
num4 = num1 >> 5; // 0000 0100 = 4
num5 = num2 >> 5; // 1111 1100 = -4
num6 = num3 >> 5; // 0000 0010 = 2
printf("%u\n", num4);
printf("%d\n", num5);
printf("%d\n", num6);
return 0;
}
- 부호 없는 자료형은 비트를 오른쪽으로 이동하면 모자라는 공간은 모두 0으로 채워진다.
- 부호 있는 자료형의 첫 번째 비트는 '부호 비트'라고 하는데 이 비트가 1이면 음수, 0이면 양수이다.
- 부호 있는 자료형을 오른쪽으로 n번 이동시키면 모자라는 공간은 모두 부호 비트의 값(부호 비트가 1이면 1로, 0이면 0)으로 채워진다.
"<<"
#include <stdio.h>
int main(void)
{
char num1 = 113; // 0111 0001
char num2 = -15; // 1111 0001
char num3, num4, num5, num6;
num3 = num1 << 2; // 1100 0100
num4 = num2 << 2; // 1100 0100
num5 = num1 << 4; // 0001 0000
num6 = num2 << 4; // 0001 0000
printf("%d\n", num3);
printf("%d\n", num4);
printf("%d\n", num5);
printf("%d\n", num6);
return 0;
}
- 부호 있는 자료형에서 비트를 왼쪽으로 이동시켰을 때는 부호 비트에 있는 숫자에 따라 양수, 음수가 결정된다.
- 따라서, 부호 있는 자료형에 시프트 연산을 할 때는 의도치 않은 결과가 나올 수 있으므로 항상 부호 비트를 생각해야 한다.
24.4 비트 연산자로 플래그 처리하기
비트가 1이면 ON, 0이면 OFF
가볍게 읽고 넘어가기..!
'C언어 > C언어 코딩 도장' 카테고리의 다른 글
[C언어 코딩 도장] Unit 25. 연습문제 및 심사문제 (0) | 2023.08.28 |
---|---|
[C언어 코딩 도장] Unit 25. 연산자 우선순위 알아보기 (0) | 2023.08.28 |
[C언어 코딩 도장] Unit 23. 연습문제 및 심사문제 (0) | 2023.08.28 |
[C언어 코딩 도장] Unit 23. 비트 연산자 사용하기 (0) | 2023.08.28 |
[C언어 코딩 도장] Unit 22. 연습문제 및 심사문제 (0) | 2023.08.28 |