이진수 (Binary Number)
개요
이진수란 0과 1, 두 개의 숫자만을 사용하여 수를 표현하는 2진법(Base-2) 체계의 수입니다. 현대 컴퓨터 과학의 가장 기초가 되는 수 체계로, 전압의 높고 낮음(High/Low)이나 스위치의 온/오프(On/Off)와 같이 두 가지 상태를 가지는 전자 회로의 물리적 특성을 가장 효율적으로 반영할 수 있기 때문에 디지털 시스템의 핵심 데이터 표현 방식으로 사용됩니다.
원리와 표기법
이진수는 각 자릿수가 2의 거듭제곱 형태의 가중치(Weight)를 가지는 위치 기수법을 따릅니다. 우리가 일상적으로 사용하는 10진수가 10의 거듭제곱($10^0, 10^1, 10^2 \dots$)을 기반으로 하는 것과 동일한 원리입니다.
이진수에서 오른쪽에서 첫 번째 자리는 $2^0(1)$, 두 번째 자리는 $2^1(2)$, 세 번째 자리는 $2^2(4)$의 값을 가지며, 왼쪽으로 갈수록 가중치는 2배씩 증가합니다.
[표 1] 이진수 자릿수별 가중치 (8비트 기준)
| 자릿수 (Position) |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
| 가중치 (2의 거듭제곱) |
$2^7$ |
$2^6$ |
$2^5$ |
$2^4$ |
$2^3$ |
$2^2$ |
$2^1$ |
$2^0$ |
| 십진수 값 |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
10진수 $\rightarrow$ 2진수 변환 (나눗셈법)
10진수를 2로 더 이상 나눌 수 없을 때까지 계속 나누고, 이때 발생하는 나머지 값들을 역순으로 읽으면 2진수가 됩니다.
[실전 예제: 10진수 25를 2진수로 변환]
1. $25 \div 2 = 12 \dots$ 나머지 1 (LSB: 최하위 비트)
2. $12 \div 2 = 6 \dots$ 나머지 0
3. $6 \div 2 = 3 \dots$ 나머지 0
4. $3 \div 2 = 1 \dots$ 나머지 1
5. $1 \div 2 = 0 \dots$ 나머지 1 (MSB: 최상위 비트)
$\rightarrow$ 결과: $11001_{(2)}$
2진수 $\rightarrow$ 10진수 변환 (가중치 합산법)
각 자릿수의 숫자(0 또는 1)에 해당 자릿수의 가중치를 곱한 후 모두 더합니다.
[실전 예제: 2진수 $10110_{(2)}$을 10진수로 변환]
- $(1 \times 2^4) + (0 \times 2^3) + (1 \times 2^2) + (1 \times 2^1) + (0 \times 2^0)$
- $= 16 + 0 + 4 + 2 + 0 = 22$
$\rightarrow$ 결과: $22_{(10)}$
# 10진수를 2진수 문자열로 변환
decimal_num = 25
binary_num = bin(decimal_num) # '0b11001' 형태로 반환
print(f"10진수 {decimal_num} -> 2진수 {binary_num[2:]}")
# 2진수 문자열을 10진수로 변환
binary_str = "11001"
decimal_converted = int(binary_str, 2)
print(f"2진수 {binary_str} -> 10진수 {decimal_converted}")
이진 연산
기본 산술 연산
- 덧셈: $0+0=0, 0+1=1, 1+0=1, 1+1=10$ (결과는 0이며 윗자리로 올림(Carry) 발생)
- 뺄셈: $0-0=0, 1-0=1, 1-1=0, 0-1=1$ (윗자리에서 2를 빌려와 $2-1=1$로 계산하며, 빌림(Borrow) 발생)
- 곱셈: 10진수 곱셈과 동일하며, 피승수가 0 또는 1이므로 단순 덧셈의 반복으로 처리됩니다.
- 나눗셈: 10진수 나눗셈과 동일한 원리로 수행됩니다.
논리 연산 (Logical Operations)
컴퓨터의 CPU 내 ALU(산술논리장치)에서 수행되는 비트 단위 연산입니다.
[표 3] 논리 연산 진리표
| 입력 A | 입력 B | AND | OR | XOR | NOT A |
| :---: | :---: | :---: | :---: | :---: | :---: |
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 | 0 |
- AND: 두 비트가 모두 1일 때만 1을 반환합니다.
- OR: 두 비트 중 하나라도 1이면 1을 반환합니다.
- XOR (Exclusive OR): 두 비트가 서로 다를 때만 1을 반환합니다. (배타적 논리합)
- NOT: 0은 1로, 1은 0으로 반전시킵니다.
2진수는 자릿수가 길어 가독성이 떨어지므로, 4비트씩 묶어 16진수 한 자리로 변환하여 표현합니다.
[변환 예제: 2진수 $11010110_{(2)}$ $\rightarrow$ 16진수]
1. 2진수를 4비트씩 나눕니다: 1101 / 0110
2. 각 묶음을 10진수로 변환합니다: $13$ / $6$
3. 10진수를 16진수 문자로 변환합니다: $13 \rightarrow \text{D}$, $6 \rightarrow 6$
$\rightarrow$ 결과: $\text{D6}_{(16)}$
컴퓨터에서의 활용과 확장
비트(Bit)와 바이트(Byte)
- 비트(Bit): Binary Digit의 약자로, 이진수의 최소 단위(0 또는 1)입니다.
- 바이트(Byte): 8개의 비트를 묶은 단위($1 \text{ Byte} = 8 \text{ bits}$)이며, 영문자 한 글자를 표현할 수 있는 기본 단위로 사용됩니다.
음수 표현: 2의 보수 (2's Complement)
컴퓨터는 양수와 음수를 구분하기 위해 최상위 비트(MSB, Most Significant Bit)를 부호 비트로 사용합니다. (0: 양수, 1: 음수) 또한, 뺄셈을 덧셈으로 처리하기 위해 2의 보수 방식을 사용합니다.
[2의 보수 변환 단계 예제: 10진수 -5 표현 (8비트 기준)]
1. 양수 5를 2진수로 표현: 00000101
2. 1의 보수 취하기 (비트 반전): 11111010
3. 결과에 1 더하기: 11111010 + 1 = 11111011
$\rightarrow$ 결과: 11111011 (이 값이 컴퓨터에서 -5로 인식됨)
부동 소수점 (Floating Point)
실수(소수점이 있는 수)를 표현하기 위해 IEEE 754 표준과 같은 부동 소수점 방식을 사용합니다. 수를 $\text{부호} \times \text{가수} \times \text{밑수}^{\text{지수}}$ 형태로 나누어 저장합니다.
- 부호부(Sign): 양수(0) 또는 음수(1) 결정
- 지수부(Exponent): 소수점의 위치를 결정
- 가수부(Mantissa): 실제 유효 숫자를 저장
16진수(Hexadecimal)와의 관계
2진수와 16진수는 $2^4 = 16$의 관계에 있어 상호 변환이 매우 간편합니다.
[표 2] 진법 대응표
| 2진수 (4bit) | 10진수 | 16진수 | 2진수 (4bit) | 10진수 | 16진수 |
| :---: | :---: | :---: | :---: | :---: | :---: |
| 0000 | 0 | 0 | 1000 | 8 | 8 |
| 0001 | 1 | 1 | 1001 | 9 | 9 |
| 0010 | 2 | 2 | 1010 | 10 | A |
| 0011 | 3 | 3 | 1011 | 11 | B |
| 0100 | 4 | 4 | 1100 | 12 | C |
| 0101 | 5 | 5 | 1101 | 13 | D |
| 0110 | 6 | 6 | 1110 | 14 | E |
| 0111 | 7 | 7 | 1111 | 15 | F |
분류: 기술 / 수학 / 수 체계
# 이진수 (Binary Number)
## 개요
이진수란 0과 1, 두 개의 숫자만을 사용하여 수를 표현하는 2진법(Base-2) 체계의 수입니다. 현대 컴퓨터 과학의 가장 기초가 되는 수 체계로, 전압의 높고 낮음(High/Low)이나 스위치의 온/오프(On/Off)와 같이 두 가지 상태를 가지는 전자 회로의 물리적 특성을 가장 효율적으로 반영할 수 있기 때문에 디지털 시스템의 핵심 데이터 표현 방식으로 사용됩니다.
## 원리와 표기법
이진수는 각 자릿수가 2의 거듭제곱 형태의 가중치(Weight)를 가지는 위치 기수법을 따릅니다. 우리가 일상적으로 사용하는 10진수가 10의 거듭제곱($10^0, 10^1, 10^2 \dots$)을 기반으로 하는 것과 동일한 원리입니다.
이진수에서 오른쪽에서 첫 번째 자리는 $2^0(1)$, 두 번째 자리는 $2^1(2)$, 세 번째 자리는 $2^2(4)$의 값을 가지며, 왼쪽으로 갈수록 가중치는 2배씩 증가합니다.
### [표 1] 이진수 자릿수별 가중치 (8비트 기준)
| 자릿수 (Position) | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| :--- | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| **가중치 (2의 거듭제곱)** | $2^7$ | $2^6$ | $2^5$ | $2^4$ | $2^3$ | $2^2$ | $2^1$ | $2^0$ |
| **십진수 값** | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
## 진법 변환
### 10진수 $\rightarrow$ 2진수 변환 (나눗셈법)
10진수를 2로 더 이상 나눌 수 없을 때까지 계속 나누고, 이때 발생하는 나머지 값들을 역순으로 읽으면 2진수가 됩니다.
**[실전 예제: 10진수 25를 2진수로 변환]**
1. $25 \div 2 = 12 \dots$ 나머지 **1** (LSB: 최하위 비트)
2. $12 \div 2 = 6 \dots$ 나머지 **0**
3. $6 \div 2 = 3 \dots$ 나머지 **0**
4. $3 \div 2 = 1 \dots$ 나머지 **1**
5. $1 \div 2 = 0 \dots$ 나머지 **1** (MSB: 최상위 비트)
$\rightarrow$ 결과: **$11001_{(2)}$**
### 2진수 $\rightarrow$ 10진수 변환 (가중치 합산법)
각 자릿수의 숫자(0 또는 1)에 해당 자릿수의 가중치를 곱한 후 모두 더합니다.
**[실전 예제: 2진수 $10110_{(2)}$을 10진수로 변환]**
- $(1 \times 2^4) + (0 \times 2^3) + (1 \times 2^2) + (1 \times 2^1) + (0 \times 2^0)$
- $= 16 + 0 + 4 + 2 + 0 = 22$
$\rightarrow$ 결과: **$22_{(10)}$**
### 프로그래밍 구현 (Python)
```python
# 10진수를 2진수 문자열로 변환
decimal_num = 25
binary_num = bin(decimal_num) # '0b11001' 형태로 반환
print(f"10진수 {decimal_num} -> 2진수 {binary_num[2:]}")
# 2진수 문자열을 10진수로 변환
binary_str = "11001"
decimal_converted = int(binary_str, 2)
print(f"2진수 {binary_str} -> 10진수 {decimal_converted}")
```
## 이진 연산
### 기본 산술 연산
- **덧셈**: $0+0=0, 0+1=1, 1+0=1, 1+1=10$ (결과는 0이며 윗자리로 **올림(Carry)** 발생)
- **뺄셈**: $0-0=0, 1-0=1, 1-1=0, 0-1=1$ (윗자리에서 2를 빌려와 $2-1=1$로 계산하며, **빌림(Borrow)** 발생)
- **곱셈**: 10진수 곱셈과 동일하며, 피승수가 0 또는 1이므로 단순 덧셈의 반복으로 처리됩니다.
- **나눗셈**: 10진수 나눗셈과 동일한 원리로 수행됩니다.
### 논리 연산 (Logical Operations)
컴퓨터의 CPU 내 ALU(산술논리장치)에서 수행되는 비트 단위 연산입니다.
**[표 3] 논리 연산 진리표**
| 입력 A | 입력 B | AND | OR | XOR | NOT A |
| :---: | :---: | :---: | :---: | :---: | :---: |
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 | 0 |
- **AND**: 두 비트가 모두 1일 때만 1을 반환합니다.
- **OR**: 두 비트 중 하나라도 1이면 1을 반환합니다.
- **XOR (Exclusive OR)**: 두 비트가 서로 다를 때만 1을 반환합니다. (배타적 논리합)
- **NOT**: 0은 1로, 1은 0으로 반전시킵니다.
### 16진수 변환 방법
2진수는 자릿수가 길어 가독성이 떨어지므로, 4비트씩 묶어 16진수 한 자리로 변환하여 표현합니다.
**[변환 예제: 2진수 $11010110_{(2)}$ $\rightarrow$ 16진수]**
1. 2진수를 4비트씩 나눕니다: `1101` / `0110`
2. 각 묶음을 10진수로 변환합니다: $13$ / $6$
3. 10진수를 16진수 문자로 변환합니다: $13 \rightarrow \text{D}$, $6 \rightarrow 6$
$\rightarrow$ 결과: **$\text{D6}_{(16)}$**
## 컴퓨터에서의 활용과 확장
### 비트(Bit)와 바이트(Byte)
- **비트(Bit)**: Binary Digit의 약자로, 이진수의 최소 단위(0 또는 1)입니다.
- **바이트(Byte)**: 8개의 비트를 묶은 단위($1 \text{ Byte} = 8 \text{ bits}$)이며, 영문자 한 글자를 표현할 수 있는 기본 단위로 사용됩니다.
### 음수 표현: 2의 보수 (2's Complement)
컴퓨터는 양수와 음수를 구분하기 위해 최상위 비트(MSB, Most Significant Bit)를 **부호 비트**로 사용합니다. (0: 양수, 1: 음수) 또한, 뺄셈을 덧셈으로 처리하기 위해 **2의 보수** 방식을 사용합니다.
**[2의 보수 변환 단계 예제: 10진수 -5 표현 (8비트 기준)]**
1. **양수 5를 2진수로 표현**: `00000101`
2. **1의 보수 취하기 (비트 반전)**: `11111010`
3. **결과에 1 더하기**: `11111010` + `1` = `11111011`
$\rightarrow$ 결과: **`11111011`** (이 값이 컴퓨터에서 -5로 인식됨)
### 부동 소수점 (Floating Point)
실수(소수점이 있는 수)를 표현하기 위해 IEEE 754 표준과 같은 부동 소수점 방식을 사용합니다. 수를 $\text{부호} \times \text{가수} \times \text{밑수}^{\text{지수}}$ 형태로 나누어 저장합니다.
- **부호부(Sign)**: 양수(0) 또는 음수(1) 결정
- **지수부(Exponent)**: 소수점의 위치를 결정
- **가수부(Mantissa)**: 실제 유효 숫자를 저장
### 16진수(Hexadecimal)와의 관계
2진수와 16진수는 $2^4 = 16$의 관계에 있어 상호 변환이 매우 간편합니다.
**[표 2] 진법 대응표**
| 2진수 (4bit) | 10진수 | 16진수 | 2진수 (4bit) | 10진수 | 16진수 |
| :---: | :---: | :---: | :---: | :---: | :---: |
| 0000 | 0 | 0 | 1000 | 8 | 8 |
| 0001 | 1 | 1 | 1001 | 9 | 9 |
| 0010 | 2 | 2 | 1010 | 10 | A |
| 0011 | 3 | 3 | 1011 | 11 | B |
| 0100 | 4 | 4 | 1100 | 12 | C |
| 0101 | 5 | 5 | 1101 | 13 | D |
| 0110 | 6 | 6 | 1110 | 14 | E |
| 0111 | 7 | 7 | 1111 | 15 | F |
분류: 기술 / 수학 / 수 체계