조금씩 꾸준히 완성을 향해

[C 언어] 진법 변환, 비트 연산, 매크로 본문

기타 언어/C 언어

[C 언어] 진법 변환, 비트 연산, 매크로

all_sound 2023. 3. 16. 22:13

 진법 변환 

 

① 10진법 → 2진법 (10진수 19를 2진수로 바꾸기)

 

방법1

: 2로 나누어 나머지 구하기 (결과 : 10011)

 

방법2

: 2의 n제곱 칸을 만들어 놓고 조합해서 집어 넣기 (19는 16 + 2+ 1 이기 때문에 16, 2, 1에 각각 1씩 넣어준다)

 

 

② 2진법  → 8진법 

 - 2진수를 뒤에서 부터 3칸씩 자르고 분리시킨다

 - 분리된 칸에 각각 2의 n 제곱 라벨을 단다 

 - 1이 들어가 있는 칸의 라벨 값을 모두 더한다

 - 각각 나온 결과를 합치면 완성!

 결과: 23

 

 

③ 2진법 → 16진법

 - 2진수를 뒤에서 부터 4칸씩 자르고 분리시킨다

 - 분리된 칸에 각각 2의 n 제곱 라벨을 단다 

 - 1이 들어가 있는 칸의 라벨 값을 모두 더한다

 - 각각 나온 결과를 합치면 완성!

 결과: 13

 


비트 연산자

 

① 논리곱 (& 연산자)

 - 숫자를 모두 2진수로 변경

 - 자리수 별로 AND 연산 수행

 

논리합 (| 연산자)

 - 숫자를 모두 2진수로 변경

 - 자리수 별로 OR 연산 수행

 

③ 비트 NOT (~연산자)

 

시프트 연산( >>, <<  연산자)

 

▶ 10>>2 (우 시프트)

 - 10을 2진수로 변경 : 1010

 - 우측으로 2칸 밀어 이동

 - 결과 값 다시 10진수로 변경: 2

▶ 10<<2 (좌 시프트)

- 10을 2진수로 변경 : 1010

- 좌측으로 2칸 밀어 이동, 뒤에 빈 칸에는 0을 채움

- 결과 값 다시 10진수로 변경: 40

 


매크로

- 반복적인 일들을 쉽게 하기 위해 만들어 놓은 것

 

#define N 10  - 변수처럼 선언: 앞으로 나오는 모든 N은 10으로 대체

#define SQR(X) X*X  - 함수처럼 선언: X라는 인자를 받으면 X*X로 처리

#define N 10  // 변수처럼 선언: 앞으로 나오는 모든 N은 10으로 대체
#define SQR(X) X*X  // 함수처럼 선언: X라는 인자를 받으면 X*X로 처리

SQR(N); //N*N = 10*10 = 100
SQR(N+2);  //N+2*N+2 = N+(2*N)+2 = 10+(2*10)+2 = 32 
           //함수랑 처리가 다르니 주의!!

 


<예제>

#include <stdio.h>

int main() {
  int x = 0x11;  //16진수 11 = 0001 0001
  int y, z;
  y = x & 0x0f;  //0x0f = 0000 1111
  z = x | 0x0f;
  printf("x=%d, y=%d, x=%d", x, y, z);
}

// x = 0001 0001 = 17(십진수)
// y = 0001 0001 & 0000 1111 = 0000 0001 = 1(십진수)
// z = 0001 0001 | 0000 1111 = 0001 1111 = 31(십진수)
// 출력: x=17, y=1, z=31

 

※ 참고) 16진수 표현

0~9  10 11 12 13 14 15
0~9 A B C D E F

 

#include <stdio.h>

#define VALUE1 1
#define VALUE2 2

int main() {
  float i;
  int j, k, m;
  i = 100/300;  
  j = VALUE1 & VALUE2;  
  k = VALUE1 | VALUE2;  
  if (j && k || i) m = i +j;
  else m = j + k;  
  printf("i=%.1f, j=%d, k=%d, m=%03d\n", i, j, k, m); 
}

// i = 0 (정수 나누기 정수 = 정수)
// j = 0001 & 0010 = 0000 = 0(십진수)
// k = 0001 | 0010 = 0011 = 3(십진수)
// m = 0 + 3
// 출력: i=0.0, j=0, k=3, m=003

 

 

 

 

 

※ 유튜브 흥달쌤 깨알 C언어 특강을 직접 정리한 내용입니다