All Posts

프로그래머 기초 수학 2-2 - 기수법

기수법

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

1234=(1×103)+(2×102)+(3×101)+(3×100)1234 = (1 \times 10^3) + (2 \times 10^2) + (3 \times 10^1) + (3 \times 10^0)

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

1234(10)1234101234_{(10)} 1234_{10}

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

11012=(1×23)+(1×22)+(1×21)+(1×20)=(8+4+0+1)13101101_{2} = (1 \times 2^3) + (1 \times 2^2) + (1 \times 2^1) + (1 \times 2^0) \\ = ( 8 + 4 + 0 + 1) \\ 13_{10}

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

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

CAFE16=(12×163)+(10×162)+(15×161)+(14×160)=5196610CAFE_{16} = (12 \times 16^3) + (10 \times 16^2) + (15 \times 16^1) + (14 \times 16^0) = 51966_{10}

근데 왜 하필 16진수가 널리 쓰이게 된것일까? 그것은 2진수를 인간이 좀더 보기 쉬운 형태 (242^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 1110 1110 11112BEEF161011\space1110\space1110\space1111_{2} \\ BEEF_{16}

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

코드 구현

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)