진법 전환을 하기 전
비트연산이 무엇이냐면
비트연산이란?
10진수를 2진수로 만든 이후에 우리가 10진수를 + - * / 하듯이 2진수를 가지고
2진수의 연산자로 연산하는 것을 뜻합니다.
10진수를 2진수로 변환하는 방법 2가지
1. 10진수를 2로 나눌 수 있을 때까지 나누고 나머지를 보자
ex. 10진수 19를 2진수로 표현
나누기 | 19 | 나머지 | |
2 | 9 | 1 | ↑ |
2 | 4 | 1 | ↑ |
2 | 2 | 0 | ↑ |
2 | 1 | 0 | ↑ |
→ | → | ↑ |
2로 나누고 나머지를 아래에서 위로 적은 수를 나열해보면 10011입니다.
2. 1부터 2를 곱한 수를 우측부터 좌측 순으로 적고, 해당 수를 만들기 위해 필요한 숫자들에 1을 채워주면 됩니다
ex. 19를 위의 방법으로 2진수 처리를 해보면
←←←←←←←←
32 16 8 4 2 1
→→→→→→→→
1 0 0 1 1
19를 만들기 위해 16하나 2하나 1하나가 필요하고 채워지지 않은 수들은 0으로 채워주시면 됩니다.
2진수에서 8진수로 변환하는 방법
8진수로 표현하기 위해 10진수에서 바로 8진수를 만드는 것 보다 2진수를 만들고 2진수를 8진수로 표현하는 것이 수월합니다.
8진수란?
한 자리가 0~7까지 표현가능한 수이고 2진수가 자리수가 많아지면 간단하게 표현하기 위해 8진수로 사용하기도 합니다.
2진수를 8진수로 변환하는 방법
2진수를 만들고 우측부터 세 자리씩 자른다
세자리로 자르는 이유
7까지밖에 표현이 안되는 수이므로 4 2 1 = 7이기 때문에 2진수를 세자리씩 잘라서 표현하게 됩니다.
4 2 1 | 4 2 1 로 잘라서 수를 표시한다
ex 위에서 만든 19 -> 2진수 10011를 8진수로 표현
첫번째자리|두번째 자리
4 2 1 | 4 2 1
0 1 0 | 0 1 1
1이 있는 곳을 찾아서 각 자리숫자로 표혆나다
2,2+1 이므로 2 3
10진수 19
2진수 10011
8진수 23
모두 19를 표현한 것입니다 확실히 8진수가 2진수보다 자리수를 덜 차지하게 되는 것을 볼 수 있습니다.
2진수에서 16진수로 변환하는 방법
16진수란?
15까지 한 자리수에 표현 할 수 있는 수이고 10이상부터는 알파벳 a(10) b(11) c(12) d(13) e(14) f(15)로 표현한다.
2진수를 16진수로 만드는 법
2진수를 4개씩 잘라서 표현한다.
8+4+2+1이 15이고
0~15까지 나타낼 수 있으므로 2진수를 4구역으로 잘라서 한 구역에 한자리씩 넣는다
ex. 10진수 19를 2진수로 변환한 10011을 다시 16진수로
첫번째자리|두번째자리
8 4 2 1 | 8 4 2 1 <- 네 자리씩 끊어준다
0 0 0 1 | 0 0 1 1 <- 2진수를 네 자리씩 끊어준 곳에 할당
1이있는 곳의 값을 더해주면
1,2+1
13
비트연산자 종류
기호 | 의미 | ex |
& | 비트 논리곱 AND | 5&3 |
| | 비트 논리합 OR | 5|3 |
^ | 비트 배타적 논리합 XOR | 5^3 |
~ | 비트 NOT | ~5 |
>> | 비트값을 우측으로 이동 | 5>>3 |
<< | 비트값을 좌측으로 이동 | 5<<3 |
5를 2진수로
8 4 2 1
0 1 0 1
3을 2진수로
8 4 2 1
0 0 1 1
And(&) / 둘 다 참이여야 1 | 0101 0011 = 0001 -> 10진수로 1 |
Or(|) 둘 중에 하나만 참이여도 1 | 0101 0011 =0111 -> 10진수로 7(1+2+4) |
Exclusive Or(^) 배타적 논리합 = 두 수가 같으면 0, 틀리면 1 |
0101 0011 = 0110 -> 10진수로 6(2+4) |
시프트 연산 << , >>
우시프트 연산 >> 은 쉽게, 낭떨어지로 숫자를 밀어 없애버린다고 생각
좌시프트 연산 << 은 왼쪽으로 밀어버리고 빈칸은 0으로 채운다고 생각
ex.
10>>2
10을 2진수로 변환 1010인데
>>2 의 의미는 우측으로 2개 숫자 낭떨어지에 밀어서 없애버려라
1010에서 우측에서 2개 떨구면 10만 남음 -> 10진수로 2
10<<2
1010에서 두 칸 밀고 00채운다
101000
32 16 8 4 2 1
1 0 1 0 0 0 -> 32 + 8 = 40출력
실전 문제
#include<stdio.h>
void main() {
int x = 0x11;
int y, x;
y = x & 0x0f;
z = x | 0x0f;
printf("x=%d, y=%d, z=%d", x, y, z);
}
해설
0x는 16진수를 나타내는 접두어입니다.
x = 0x11
16진수 11은 각 자리수를 1 , 1로 끊어놓고
8 4 2 1 | 8 4 2 1
0 0 0 1 | 0 0 0 1
로 표현할 수 있다.
마찬가지로 0f도 4비트씩 표현되는 16진수를 의미하는데,
0 | f로 나뉘어져 있다 라고 표현합니다
f는 위에서 언급 했듯,
16진수가 10이상이 되면 한자리로 표현하기 어려움으로 10부터 a b c d e f 를 부여하여 표기한 방법입니다.
그래서 16진수 f는 10진수 15를 의미합니다.
0f(10진수 15)를 2진수로 표기하면
8 4 2 1 | 8 4 2 1
0 0 0 0 | 1 1 1 1
y = x & 0x0f
= 00010001
00001111
------------
00000001 ->10진수로 변환하면 1
z = x | 0x0f
= 00010001
00001111
-------------
00011111 -> 10진수로 변환하면 1+2+4+8+16 = 31
// 2진수 변환할 때나 8 4 2 1 | 8 4 2 1 이렇게 잘랐지
10진수 변환할 때는 128 64 32 16 | 8 4 2 1로 1에 채워진 값을 다 더하면 된다.
0 0 0 1 | 1 1 1 1
x= 0x11을 10진수로 나타애면
00010001인데
128 64 32 16 | 8 4 2 1
0 0 0 1 | 0 0 0 1
16+1 = 17
x = 17
y = 1
z = 31
'iOS > 정보처리기사' 카테고리의 다른 글
[정보처리기사] C언어 - 삼항연산자(조건연산자) 사용법 (0) | 2022.05.27 |
---|---|
[정보처리기사] C언어 - 매크로(feat. 매크로를 적용한 비트연산문제) (0) | 2022.05.26 |
[정보처리기사] C언어 - 출력 변환 기호(%d, %f, %c, %s, %x, %o, 16진수, 8진수 변환) (0) | 2022.05.24 |
[정보처리기사] C언어 - 관계연산자/논리연산자, 조건문 (0) | 2022.05.23 |
[정보처리기사] C언어 - 연산자 우선순위 (0) | 2022.05.23 |