
컴퓨터 공부를 시작하면 가장 먼저 마주치는 외계어가 바로 `0`과 `1`로만 이루어진 세상, 그리고 `0x`로 시작하는 알 수 없는 숫자들입니다. 우리는 평생 손가락 10개를 이용해 숫자를 세는 10진수에 익숙해져 있지만, 컴퓨터는 전기가 통하고(1) 안 통하고(0)의 두 가지 상태만 알 수 있는 기계입니다. 따라서 개발자가 되려면 컴퓨터의 언어인 2진수와, 이를 보기 좋게 줄여놓은 16진수에 익숙해져야 합니다. 오늘은 이 진법들이 왜 필요하며, 서로 어떻게 변환하는지 그 원리를 완벽하게 정리해 드립니다.
1. 진법(Base)이란 무엇인가?
진법은 '자릿수가 올라가는 기준'입니다. - 10진수 (Decimal): 0부터 9까지 10개의 숫자를 사용합니다. 9 다음은 자릿수를 올려 10이 됩니다. - 2진수 (Binary): 0과 1, 단 2개의 숫자를 사용합니다. 1 다음은 자릿수를 올려 10(십진수 2)이 됩니다. - 16진수 (Hexadecimal): 0부터 9, 그리고 A부터 F까지 총 16개의 문자를 사용합니다. F(십진수 15) 다음은 자릿수를 올려 10(십진수 16)이 됩니다.
2. 왜 16진수를 쓸까? (2진수의 압축)
컴퓨터가 2진수를 쓰는 건 알겠는데, 왜 뜬금없이 16진수가 등장할까요? 2진수는 너무 길기 때문입니다. 예를 들어 십진수 `255`를 2진수로 쓰면 `11111111`입니다. 읽기도 힘들고 쓰기도 힘듭니다. 그런데 2진수 4자리는 $2^4 = 16$가지 경우의 수를 가지므로, 정확히 16진수 한 글자와 매칭됩니다. 즉, 2진수 4자리를 묶어서 16진수 1자리로 표현하면 `1111 1111`이 `FF`라는 아주 짧은 문자로 바뀝니다. 메모리 주소값이나 색상 코드(#FFFFFF)가 16진수를 쓰는 이유가 바로 이 가독성과 압축 효율 때문입니다.
3. 진법 변환 방법 (계산 원리)
3-1. 2진수 <-> 10진수
- 2진수 -> 10진수: 각 자리에 가중치($2^0, 2^1, 2^2...$)를 곱해서 더합니다.
예: `1011` = $(1 \times 8) + (0 \times 4) + (1 \times 2) + (1 \times 1) = 8 + 0 + 2 + 1 = 11$ - 10진수 -> 2진수: 몫이 0이 될 때까지 2로 계속 나눈 뒤, 나머지를 거꾸로 읽습니다.
3-2. 2진수 <-> 16진수 (꿀팁)
이 변환은 계산할 필요 없이 '4개씩 끊어 읽기'만 하면 됩니다. (8421 법칙) 예를 들어 2진수 `11011010`을 16진수로 바꿔봅시다. 1. 뒤에서부터 4개씩 끊습니다: `1101` / `1010` 2. 앞부분 `1101` = $8+4+0+1 = 13$ -> 16진수 D 3. 뒷부분 `1010` = $8+0+2+0 = 10$ -> 16진수 A 4. 합치면 0xDA가 됩니다.
4. 개발자가 알아야 할 비트와 바이트
이 진법 개념은 데이터 단위와 직결됩니다. - 비트(Bit): 2진수 한 자리 (0 또는 1). 정보의 최소 단위. - 바이트(Byte): 8개의 비트가 모인 것. 영문자 한 글자를 저장할 수 있는 크기입니다. - 1바이트의 범위: `00000000` ~ `11111111` (0 ~ 255). 그래서 IP 주소가 255까지만 있고, RGB 색상이 255까지만 있는 것입니다.
1. 컴퓨터는 전기 신호(On/Off)를 다루기 위해 2진수를 기본 언어로 사용합니다.
2. 16진수는 긴 2진수를 4비트씩 묶어 짧게 표현하기 위한 수단입니다 (가독성 향상).
3. 8421 법칙을 기억하면 2진수와 16진수 간의 변환을 암산으로도 빠르게 할 수 있습니다.