비트와 바이트(Bit & Byte)
비트(Bit): Binary Digit의 줄임말인 비트는 "컴퓨터가 데이터를 나타내는 최소 단위"이다. 1비트는 2가지 상태(OFF, ON 또는 0, 1)만 표현이 가능하다. 1비트는 $2^1$개, 2비트는 $2^2$개, n비트는 $2^n$개의 숫자를 표현할 수 있다. 64bit 컴퓨터의 경우는 $2^{64}$개의 숫자를 표현할 수 있는 것이다.
바이트(Byte): 8비트가 모이면 1개의 바이트가 만들어진다. 1바이트는 8비트이므로 $2^8$개의 데이터 표현이 가능하다. 영문자나 숫자는 보통 1바이트, 한글 1글자는 2바이트로 표현된다.
단위 | Byte | KB | MB | GB | TB | PB | EB |
의미 | Byte | Kilo Byte | Mega Byte | Giga Byte | Tera Byte | Peta Byte | Exa Byte |
용량 |
8 bit | 1024 byte | 1024 Kbyte | 1024 Mbyte | 1024 Gbyte | 1024 Tbyte | Pbyte |
2진수 | $2^{10}$ | $2^{20}$ | $2^{30}$ | $2^{40}$ | $2^{50}$ | $2^{60}$ | |
10진수 | $10^{3}$ | $10^{6}$ | $10^{9}$ | $10^{12}$ | $10^{15}$ | $10^{18}$ |
진법
많은 진법들이 세상에 존재하지만 우리가 집중해야 할 진법은 바로 "10진법", "2진법", "8진법", "16진법"이다.
- `10진법(Decimal)`: 0부터 9까지 10개의 숫자를 한 묶음으로 해서 1자리씩 위로 올리는 방법
- `2진법(Binary)`: 0과 1이라는 두 개의 숫자만으로 수를 나타내는 진법이며, 2의 지수 승으로 자릿수를 올리는 방법
- `8진법(Octal)`: 0부터 7까지 8개의 숫자로 수를 표현하는 방법
- `16진법(Hexa-decimal)`: 0~9까지의 숫자와 A~F까지의 문자를 함께 사용하여 수를 표현하는 방법
각 진법의 숫자를 비교하면 다음과 같다.
10진수 | 2진수 | 8진수 | 16진수 |
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
16 | 10000 | 20 | 10 |
17 | 10001 | 21 | 11 |
진법 변환
10진수를 2진수로 변환하기 (정수)
1. 10진수를 "2"로 나누고, 기록한다.
2. 나눈 몫을 다시 변환하고자 하는 "2"로 나누고, 해당 나머지를 기록한다.
3. 계속 이 방법으로 나누고 더 이상 나눌 수 없을 때 끝을 낸다.
4. 마지막 몫과 기록한 나머지들을 순서대로 적으면 2진법 수가 나오게 된다.
Ex) 10진수 41은 2진수로 변환하면 101001이 나오게 된다.
10진수를 2진수로 변환하기 (소수)
가장 먼저, 소수점이 있을 때 정수가 0이면 바로 계산하고, 정수가 0이 아니면 정수와 소수부분을 분리하여 계산한다.
Ex) "0.6875" 라면 바로 밑의 과정 진행하고, "35.6875" 라면 "35 + 0.6875" 로 정수와 소수를 따로 계산을 진행한다.
1. 소수점이 있는 경우에는 소수점 아래의 소수 부분에 2를 계속 곱하면서 정수로 자리 올림이 발생하는지 확인한다.
2. 이때 자리올림이 발생하는 경우, 1이 소수점 자리에 위치하게 되고 자리올림이 발생하지 않는 경우에는 0이 소수점 자리에 위치하게 된다.
3. 이 과정을 계속 진행하여 소수점 아래 부분이 모두 "0"이 되는 경우 계산이 종료된다.
Ex) 0.6875 X 2 = 1.3750이 되는데 이때 올라간 정수 "1"은 2진수에서 0.1이 된다. 그리고 소수 부분만 다시 분리하여 0.3750을 만들고 다시 X 2를 진행한다. 이때는 0.7500이 되기 때문에 정수 "0"이 그 다음 소수점 자리에 위치하여 0.10이 된다.
TIP!
소수 부분을 변환하는 경우, 10진수에서는 유한 소수라고 하더라도 2진수에서는 무한 소수가 될 수 있다.
2진수를 10진수로 변환하기 (정수)
1. 2진수의 0과 1을 각 자릿수만큼의 2의 지수 제곱으로 곱한다.
2. 각자 곱한 값들을 모두 더하면 계산은 끝이 난다.
$$ \begin{align} 101001_{2} &= 1 \times 2^5 + 1 \times 2^3 + 1 \times 2^0 \\&= 1 \times 32 + 1 \times 8 + 1 \times 1 \\&= 32 + 8 + 1 \\&= 41_{10} \end{align} $$
2진수를 10진수로 변환하기 (소수)
1. 정수의 변환 방식과 동일하게 각 자릿수를 고려해 계산한다.
2. 다만, 소수점 아래로 내려갈수록 지수 제곱이 커지고 마이너스를 붙여 계산한다.
(소수점 아래로 내려갈수록 지수 제곱 자체는 작아진다는 뜻이다. -1, -2, -3, -4 ...)
$$ \begin{align} 0.1011_{2} &= 1 \times 2^{-1} + 0 \times 2^{-2} + 1 \times 2^{-3} + 1 \times 2^{-4} \\&= 1 \times 0.5 + 1 \times 0.125 + 1 \times {0.0625} \\&= 0.5 + 0.125 + 0.0625 \\&= 0.6875_{10} \end{align} $$
진법 변환 정리
- `10진수 -> 2진수`: 정수 부분과 소수 부분을 각각 2진수로 변환하고, 가운데 소수점을 찍어준다.
- `2진수 -> 10진수`: 2진수의 각 자리의 숫자를 2의 지수 승에 맞추어서 더해주는 방식으로 변환한다.
- `2진수 -> 8진수`: 정수 부분은 "소수점을 기준으로 왼쪽 방향'으로 3자리씩, 소수 부분은 "소수점을 기준으로 오른쪽"으로 3자리씩 묶어서 변환한다.
- `2진수 -> 16진수`: 정수 부분은 "소수점을 기준으로 왼쪽 방향'으로 4자리씩, 소수 부분은 "소수점을 기준으로 오른쪽"으로 4자리씩 묶어서 변환한다.
- `8진수/16진수 -> 2진수`: 8진수 1자리는 "2진수 3비트"로, 16진수 1자리는 "2진수 4비트"로 풀어서 변환한다.