본문 바로가기

C

C 입출력 ASCII 코드 그리고 비트 연산자

1) 입력 : scanf 함수(python의 input과 같은 기능)

//scanf 와 입력값의 변화

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
    int x;
    
    printf("입력 값 : ");
    scanf("%i", &x);				// 정수를 8, 10, 16진수로 가져옴
    printf("%d", x);				// 10진수
    printf("%o", x);				// 8진수
    printf("%x", x);				// 16진수
}

 

scanf 함수를 활용하기 위해선 

#define _CRT_SECURE_NO_WARNINGS 의 정의가 필요하다 혹은

scanf_s 함수를 활용할 수 있다.

 

* scanf 함수를 이용해보면서 헷갈렸던 것

다양한 서식 지정자 중 %i 에 관한 것이 이해하기 힘들었다.

내가 보던 책에는 "정수를 10진수, 8진수, 16진수로 입력" 이라고만 설명이 되어 있었고,

그래서 예시라든지 다른점이 뭔데? 라고 생각이 들었다.

 

복습하던 중 확실히 이해할 수 있었다.

즉, scanf 함수를 통해 입력 받은 값이 메모리에는 10진수, 8진수, 16진수로 입력이 되어있고

이것을 printf 함수에서의 서식 지정자를 활용해 각 진수로 표현할 수 있던 것이었다.

 

나는 python의 input 만 써봤는데 그래서 그런지 간단하면서도 쉬운 원리들이 

막상 정해진 룰대로만 해야 한다는 C를 접해보면서

간혹 어려움에 빠지고 있다.

 

 

위의 코드와 같이 작성을 하고 실행해보자

 

 

 

0x12 라는 값을 넣어주자 각 진수에 해당하는 값이 나온다

scanf() 에서 %i 서식 지정자로 0x12에 해당하는 정수를 가져온 것이고

이를 8, 10, 16진수로 저장해두고 있는 상태이다.

 

printf() 에서 %o(8진수) / %d(10진수) / %x(16진수) 로 값을 가져오자

각각에 해당하는 진수를 출력하고 있다.

 

 

2) ASCII 코드와 문자열 연산 원리

ASCII 코드란 : American Standard Code for Information Interchange 의 줄임말이다.

코드표는 간단한 구글링으로 여러 이미지를 찾아볼 수 있으니 참조.

 

10진수로 표현되는 각 수에 16진수 그리고 char 형이 들어있다.

예) char : A = dec : 65 = hex : 41

A 대문자는 10진수의 65, 16진수의 41로 표현될 수 있다는 뜻이다.

 

대문자 A 부터 65, B 66, C 67 ... 등으로 나아가며

이러한 코드표의 진수 크기차로 인해 문자간의 연산도 가능하다.

 

 

#define _CRT_SECURE_NO_WARNINGS		//scanf() 함수 사용시 필요
#include <stdio.h>

int main(void)
{
	int a;
    
    printf("수를 입력하세요 : ");
    scanf("%i%", &a);
    
    printf("8진수 : %o", a);
    printf("10진수 : %d", a);
    printf("16진수 : %#02x", a);	// x 앞에 # 을 붙여 0x 부분도 표현
}

%x 사이에 # 을 붙여 02(자리수) 와 함께 0x ~ 되는 부분을 표현할 수 있다.

 

 

 

 

 

3) 논리 연산자 / 비트 연산자

파이썬에선 논리 연산자만 사용해본 기억이 있다.

비트 자체에 연산을 한다는 개념에 상당 부분 충격을 먹었다.

 

논리 연산자 : x && y / x || y / !x

비트 연산자 : x & y / x | y / x ^ y / ~x / x << y / x >> y

 

 

 

* 비트 연산자를 활용한 좋은 문제

[ RGB 색상 표기법 ]

32비트로 저장되는 RGB 색상 Red, Green, Blue 가 있다.

최상위 1바이트는 사용하지 않고, 각 색상이 1바이트씩 차지하고 있다.

Red : 최하위 / Green : 중간 / Blue : 상위 / Not Used : 최상위

unsigned int 를 활용하여 각 색상의 값을 입력하였을 때 RGB 색상을 출력하시오.

 

ex) 

red 값 입력 : 256 --> 256이 아닌 0으로 저장되어야 함

green 값 입력 : 128

blue 값 입력 : 255

RGB 색상 : FF8000

 

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	unsigned int red, green, blue;				// unsigned int = 0 ~ 255
	unsigned int mask = 0xff;				// 0xff = 8비트 2진수 : 1111 1111
	unsigned int rgb = 0;

	printf("Red 값 입력 : ");
	scanf("%i", &red);
	red &= mask;

	printf("Green 값 입력 : ");
	scanf("%i", &green);
	green &= mask;

	printf("Blue 값 입력 : ");
	scanf("%i", &blue);
	blue &= mask;

	rgb = red | (green << 8) | (blue << 16);		// (not used)(blue)(green)(red) 8비트씩
	printf("RGB : %06X", rgb);

}

 

 

'C' 카테고리의 다른 글

C 배열과 포인터 그리고 함수 적용  (1) 2023.02.27
C vs Python 함수와 배열  (0) 2023.02.23
C vs Python 조건문, 반복문  (4) 2023.02.22