본문 바로가기

스터디/코딩

[ 코딩 도장 : C ] Unit 23. 비트 연산 사용하기 : 연습문제 / 심사문제

23.6 연습문제 : 비트 논리 연산자 사용하기

문제) 다음 소스 코드를 완성하여 5, 4, 1, 250이 각 줄에 출력되게 만드세요.

#include <stdio.h>

int main()
{
    unsigned char num1 = 1;
    unsigned char num2 = 5;

    printf("%u\n", num1 | num2); //|or 하나라도
    printf("%u\n", num1 ^ num2); //^xor 같으면 0, 다르면 1
    printf("%u\n", num1 & num2); //&and 둘다

    num1 = ~ num2; //~not
    printf("%u\n", num1);

    return 0;
}

 

 

23.7 연습문제 : 시프트 연산자 사용하기

문제) 다음 소스 코드를 완성하여 4가 출력되게 만드세요.

#include <stdio.h>

int main()
{
    unsigned char num1 = 32;

    num1 = num1 >> 4 << 1;

    printf("%u\n", num1);

    return 0;
}

 

 

23.8 심사문제 : 비트 논리 연산자 사용하기

문제) 표준 입력으로 두 정수(unsigned int)가 입력됩니다. 입력된 두 정수의 비트 연산 결과를 각 줄에 출력하는 프로그램을 만드세요(scanf 함수 호출 전에 문자열을 출력하면 안 됩니다).

  1. num1과 num2을 비트 XOR 연산
  2. num1과 num2을 비트 OR 연산
  3. num1과 num2를 비트 AND 연산
  4. num1을 비트 NOT 연산

출력 결과는 서식 지정자 %u를 사용하세요.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    unsigned int num1;
    unsigned int num2;
    scanf("%d %d", &num1, &num2);

    printf("%u\n", num1^num2);
    printf("%u\n", num1|num2);
    printf("%u\n", num1&num2);
    printf("%u\n", ~num1);

    return 0;
}

 

 

23.9 심사문제: 시프트 연산자 사용하기

문제) 표준 입력으로 정수가 입력됩니다. 입력된 정수를 왼쪽으로 20번, 오른쪽으로 4번 시프트 연산하여 결과를 출력하는 프로그램을 만드세요(scanf 함수 호출 전에 문자열을 출력하면 안 됩니다). 단, 정수형 변수는 unsigned long long으로 선언하고 출력 결과는 서식 지정자 %llu를 사용하세요.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    unsigned long long num1;
    scanf("%lld", &num1);

    num1 = num1 << 20 >> 4;

    printf("%llu\n", num1);

    return 0;
}

 

>> 서식지정자 항상 유념하기!! 값이 정상적으로 나온다고해도 맞춰주는게 좋쥐 ^>^

서식 지정자 자료형 의미
%c char 문자
%s char*, char[] 문자열
%hd short 부호를 포함한 2byte 크기의 정수 (10진수)
%d int 부호를 포함한 int 타입 크기의 정수 (10진수)
%ld long 부호를 포함한 long 타입 크기의 정수 (10진수)
%lld long long 부호를 포함한 8byte 크기의 정수 (10진수)
%hi short 부호를 포함한 2byte 크기의 정수 (10진수)
%i int 부호를 포함한 int 타입 크기의 정수 (10진수)
%li long 부호를 포함한 long 타입 크기의 정수 (10진수)
%lli long long 부호를 포함한 8byte 크기의 정수 (10진수)
%hu unsigned short 부호를 포함하지 않는 2byte 크기의 정수 (10진수)
%u unsigned int 부호를 포함하지 않는 int 타입 크기의 정수 (10진수)
%lu unsigned long 부호를 포함하지 않는 long 타입 크기의 정수 (10진수)
%llu unsigned long long 부호를 포함하지 않는 8byte 크기의 정수 (10진수)
%ho unsigned short 부호를 포함하지 않는 2byte 크기의 정수 (8진수)
%o unsigned int 부호를 포함하지 않는 int 타입 크기의 정수 (8진수)
%lo unsigned long 부호를 포함하지 않는 long 타입 크기의 정수 (8진수)
%llo unsigned long long 부호를 포함하지 않는 8byte 크기의 정수 (8진수)
%hx unsigned short 부호를 포함하지 않는 2byte 크기의 정수 (16진수, abcdef 를 소문자로 표기)
%x unsigned int 부호를 포함하지 않는 int 타입 크기의 정수 (16진수, abcdef 를 소문자로 표기)
%lx unsigned long 부호를 포함하지 않는 long 타입 크기의 정수 (16진수, abcdef 를 소문자로 표기)
%llx unsigned long long 부호를 포함하지 않는 8byte 크기의 정수 (16진수, abcdef 를 소문자로 표기)
%hX unsigned short 부호를 포함하지 않는 2byte 크기의 정수 (16진수, ABCDEF 를 대문자로 표기)
%X unsigned int 부호를 포함하지 않는 int 타입 크기의 정수 (16진수, ABCDEF 를 대문자로 표기)
%lX unsigned long 부호를 포함하지 않는 long 타입 크기의 정수 (16진수, ABCDEF 를 대문자로 표기)
%llX unsigned long long 부호를 포함하지 않는 8byte 크기의 정수 (16진수, ABCDEF 를 대문자로 표기)
%f float 소수점으로 표현한 4byte 크기의 실수 (10진수)
%lf double 소수점으로 표현한 8byte 크기의 실수 (10진수)
%llf , %Lf long double 소수점으로 표현한 long double 타입 크기의 실수 (10진수)
%e float 지수 표기법으로 표현한 4byte 크기의 실수 (10진수, 소문자 e)
%le double 지수 표기법으로 표현한 8byte 크기의 실수 (10진수, 소문자 e)
%Le long double 지수 표기법으로 표현한 long double 타입 크기의 실수 (10진수, 소문자 e)
%E float 지수 표기법으로 표현한 4byte 크기의 실수 (10진수, 대문자 E)
%lE double 지수 표기법으로 표현한 8byte 크기의 실수 (10진수, 대문자 E)
%LE long double 지수 표기법으로 표현한 long double 타입 크기의 실수 (10진수, 대문자 E)
%g float %f 와  %e 둘중에 짧은 길이로 표현되는 서식 지정자를 사용 (소문자 e)
%lg double %lf 와 %le 둘중에 짧은 길이로 표현되는 서식 지정자를 사용 (소문자 e)
%Lg long double %Lf 와 %Le 둘중에 짧은 길이요 표현되는 서식 지정자를 사용 (소문자 e)
%G float %f 와 %e 둘중에 짧은 길이로 표현되는 서식 지정자를 사용 (대문자 E)
%lG double %lf 와 %le 둘중에 짧은 길이로 표현되는 서식 지정자를 사용 (대문자 E)
%LG long double %Lf 와 %Le 둘중에 짧은 길이로 표현되는 서식 지정자를 사용 (대문자 E)