진법변환
- 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)
}
'C' 카테고리의 다른 글
반복문(while, do ~ while, for), if 문 (0) | 2023.03.14 |
---|---|
삼항연산자(조건연산자), 제어문(if, switch), 반복문(for) (0) | 2023.03.13 |
출력형식 (0) | 2023.03.10 |
관계/논리연산자, 조건문, 산술연산자 (0) | 2023.03.10 |
산술연산자, 연산자 우선순위 (0) | 2023.03.08 |