---
title: 프로그래머 기초 수학 2-2 - 기수법
tags:
  - algorithm
published: true
mathjax: true
date: 2020-07-24 06:34:51
description: '기수법'
category: programming
slug: /2020/07/math-for-programmer-chapter2-2-notation/
template: post
---

## 기수법

우리가 흔히 사용하는 숫자 1234는 다음과 같이 표현할 수 있다.

$$
1234 = (1 \times 10^3) + (2 \times 10^2) + (3 \times 10^1) + (3 \times 10^0)
$$

여기 나오는 `10`처럼 그 거듭 제곱으로 자리의 값을 취하는 숫자를 `밑` 이라고 하고, 체계의 이름은 `진법`이라는 말을 붙인다. 즉 저 숫자는 10진법으로 나타낸 수다. 어떤 진법을 썼는지 나타내기 위해서는 밑에 작게 표현한다

$$
1234_{(10)} 1234_{10}
$$

이와 비슷하게, 0과 1로만 표현되어 있는 숫자는 2진법이라고 한다. 2진법은 논리적으로 참과 거짓에 대응 되며, 이는 전기 신호로 1, 0을 표현하는 컴퓨터의 기본체계를 이룬다.

$$
1101_{2} = (1 \times 2^3) + (1 \times 2^2) + (1 \times 2^1) + (1 \times 2^0)
= ( 8 + 4 + 0 + 1)
13_{10}
$$

이와 비슷하게, 16비트로 나타낼수 있는 수는 $2^{16} - 1 = 65536$이다.

2진법과 더불어 컴퓨터 과학분야에서 많이 쓰이는 것이 16진법이다. 16진법은 0~9와 더불어 `A, B, C, D, E, F` 를 사용하여 숫자를 표현한다. 각각 `10, 11, 12, 13, 14, 15`를 나타낸다.

$$
CAFE_{16} = (12 \times 16^3) + (10 \times 16^2) + (15 \times 16^1) + (14 \times 16^0) = 51966_{10}
$$

근데 왜 하필 16진수가 널리 쓰이게 된것일까? 그것은 2진수를 인간이 좀더 보기 쉬운 형태 ($2^4$)로 바꾼 것이 기 때문이다. 이는 정확하게 4비트를 나타낸다.

| 2진수  | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
| ------ | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| 16진수 | 0    | 1    | 2    | 3    | 4    | 5    | 6    | 7    |
| 2진수  | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
| 16진수 | 8    | 9    | A    | B    | C    | D    | E    | F    |

0과 1을 나열한 것은 바로 알아보기 쉽지 않지만, 이를 네개씩 묶어서 표현할 수 있다.

$$
1011\space1110\space1110\space1111_{2}
BEEF_{16}
$$

거꾸로 10진수를 다른 진법으로 나타내기 위해서는, 해당 10진법 숫자를 변환을 원하는 밑으로 나누어서 표현하면 된다.

## 코드 구현

```javascript
var dec = 123
var hex = dec.toString(16) // 변환을 원하는 밑을 넣는다.
var bin = dec.toString(2)

var hex = '7b'
var dec = parseInt(hex, 16) // 해당숫자의 밑을 넣는다.
var bin = dec.toString(2)
```
