우선, 다음 링크에 있는 실습 문제들을 코드와 함께 하나씩 살펴보자!
https://colab.research.google.com/drive/1Z6wqy-AnFlGBNxfxwwJhS5GOwBWFeX37?usp=sharing
- 255이하의 양의 정수를 입력받고, 그 값을 비트로 표현하는 프로그램을 아래 연산자를 사용하여 작성하시오.
산술연산자 사용
비트연산자 사용
비트이동연산자 사용
void practice_one_one()
{
//정수 입력받기
int input;
printf("정수를 입력하세요: ");
scanf("%d",&input);
//255이하의 양의 정수만을 입력받으니 8비트면 충분함=>8자리로 출력하도록 코드 구성
int temp = 128;
for(int i=0;i<8;i++)
{
printf("%d",input/temp);
input = input%temp;
temp = temp/2;
}
}
void practice_one_two()
{
//정수 입력받기
int input;
printf("정수를 입력하세요: ");
scanf("%d",&input);
//비트연산자를 활용하여 8자리로 출력하도록 코드 구성
int temp = 128;
for(int i=0;i<8;i++)
{
printf("%d",(input&temp)==temp?1:0);
temp = temp/2;
}
}
표현하고자 하는 숫자는 그대로 두고, temp라는 128의 정수를 절반씩 줄여가면서
&의 비교연산자를 활용하여 1과 0인지 출력한다.
void practice_one_three()
{
//정수 입력받기
int input;
printf("정수: ");
scanf("%d",&input);
int temp = 128;
for(int i=0;i<8;i++)
{
printf("%d", (input&temp)==temp?1:0);
input = input<<1;
}
}
비교대상인 128은 그대로 두고, 표현하고자 하는 숫자를 원래부터 왼쪽으로 한칸씩,
즉 2배씩 시켜가면서 8자리의 비트를 모두 확인한다.
&연산자를 활용하여 128과 같으면 1로, 다르다면 0으로 출력하여 2진수로 표현한다.
- 정수를 입력 받아 입력 받은 정수의 부호를 판단하시오. 또, 입력 받은 수의 절댓값과 절댓값을 4로 나눈 몫과 나머지를 구하는 프로그램을 작성하시오.
부호 판단, 몫, 나머지 계산시 비트연산자를 사용할 것.
예시와 같이 따옴표, 들여쓰기 출력할 것.
void practice_two()
{
//정수 입력받기
int input;
printf("정수: ");
scanf("%d",&input);
int abs = (input&0x80000000)==0x80000000?(-1)*input:input;
printf("\"%d은 %s입니다. 이 수의 절댓값은 %d이고,",input,(input&0x80000000)==0x80000000?"음수":"양수",abs);
printf("\n");
printf("\t");
printf("절댓값을 4로 나눈 몫은 %d이고\n",abs>>2);
printf("\t");
printf("\t");
printf("나머지는 %d입니다.\"",abs&3);
}
이 문제에서 재미난 포인트는 abs라는 절댓값을 표현하는 부분과,
몫과 나머지를 표현하는 부분이다.
먼저 절댓값을 표현하기 위해서 양수인지, 음수인지 판단을 하는 과정이 필요한데
int는 4Byte, 즉 32비트이기 때문에 MSB를 비교해야하는 부호판정 논리 상
-2^16이라는 매우 큰 숫자를 다뤄야한다.
이를 계산하기는 쉽지 않으므로 4개씩 끊어서 16진수를 표현하는 0x를 써준 후에
80000000을 붙여주면 1과 0이 31개 붙여진 수를 간단하게 표현할 수 있다.
몫과 나머지는 전 포스팅에서 설명한 논리를 이용하여 간단하게 구현할 수 있다.
실행결과는 다음과 같다.
- 255이하의 양의 정수를 입력받아 오른쪽으로부터 두 번째 비트값을 알아내고, 오른쪽에서 네 번째 비트 값은 반전시키는 프로그램을 비트연산자를 사용하여 작성하시오.
void practice_three()
{
//정수 입력받기
int input;
printf("255이하의 양의 정수: ");
scanf("%d",&input);
int temp_1 = 128;
printf("입력 값의 비트표현: ");
for(int i=0;i<8;i++)
{
printf("%d",(input&temp_1)==temp_1?1:0);
temp_1 = temp_1/2;
}
printf("\n");
printf("입력 값의 오른쪽에서 두 번째 비트: %d\n", (input&2)==2?1:0);
printf("입력 값의 오른쪽에서 네 번째 비트: %d\n", (input&8)==8?1:0);
printf("변환 값의 비트표현: ");
int temp_2 = 128;
int change_after = input^8;
for(int i=0;i<8;i++)
{
printf("%d",(change_after&temp_2)==temp_2?1:0);
temp_2 = temp_2/2;
}
printf("\n");
printf("입력 값의 오른쪽에서 두 번째 비트: %d\n", (change_after&2)==2?1:0);
printf("입력 값의 오른쪽에서 네 번째 비트: %d\n", (change_after&8)==8?1:0);
}
마찬가지로 전 포스팅에서 XOR을 사용하여 반전시키는 논리는 정리를 했고,
추가적으로 특정 비트만을 출력하기 위해서는 1과 0으로 이루어진 숫자와 &연산을
취하는 방식을 활용하면 된다.
실행결과는 다음과 같다.