C

진법변환, 비트연산, 매크로

김꼬알 2023. 3. 13. 16:57

진법변환

  • 19를 2진수로 변환하면 10011
  • 10진수 숫자를 2로 나누어지지 않을 때까지 나눈 다음 거꾸로 읽는다

 

  • 2진수 10011을 8진수로 변환하면 23
  • 8진수는 0~7까지의 숫자로 표현한다
  • 3자리씩 나눈 다음 1이 있는 곳의 숫자를 더한다

 

  • 2진수 10011을 16진수로 변환하면 13
  • 16진수는 0~15까지의 숫자로 표현한다
  • 4자리씩 나눈 다음 1이 있는 곳의 숫자를 더한다

 

 

비트연산자 종류

기호 의미
& 비트 논리곱(AND) 5 & 3
| 비트 논리합(OR) 5 | 3
^ 비트 배타적 논리합(XOR) 5 ^ 3
~ 비트 NOT ~5
>> 비트값을 우측으로 이동 5 >> 3
<< 비트값을 좌측으로 이동 5 << 3

 

  • 양수일 때는 +1 한 다음 - 를 붙여주고 음수일 때는 -1한 다음 - 를 뺀다

 

#include<stdio.h>
void main(){
    int x = 0x11;    // x = 16진수 11을 2진수로 바꾸면 00010001
    int y, z;
    y = x & 0x0f;    // y = x와 00001111을 and 연산하면 00000001
    z = x | 0x0f;    // z = x와 00001111을 or 연산하면 00011111
    printf("x=%d, y=%d, z = %d", x, y, z);    // x = 17, y = 1, z = 31
}

 

 

매크로란?

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

#define N 10    // 앞으로 나오는 N은 10으로 대체

#define SQR(X) X*X    // SQR(X)를 함수처럼 사용, 인자*인자를 한 후 리턴
#define N 10
#define SQR(X) X*X

SQR(N);    // SQR(10) = 10*10 이므로 100
SQR(N+2);    // SQR(10+2) = 10+2 * 10+2 이므로 32 (2*10을 먼저 수행하기 때문에)

 

 

시프트 연산(>>)

  • 10을 2진수로 바꾼 다음 뒤에 숫자(2)만큼 오른쪽으로 밀어서 없앤다

 

  • 10을 2진수로 바꾼 다음 뒤에 숫자(2)만큼 0을 추가한다

 

#define VALUE1 1    // VALUE1은 1로 대체
#define VALUE2 2    // VALUE2는 2로 대체
main(){
    float i;
    int j, k, m;
    i = 100 / 300;    // i = 0.0 
    j = VALUE1 & VALUE2;    // j = 0001과 0010을 and연산하면 0
    k = VALUE1 | VALUE2;    // k = 0001과 0010을 or연산하면 3
    if(j && k || i) m = i + j;    // 0 && 3 = 0, 0 || 0 = 0이므로 else로 넘어감
    else m = j + k;    // m = 0 + 3
    printf("i = %.1f j = %d k = %d m = %03d\n", i, j, k, m)
}