·8분 읽기

진법 변환 이해하기 — 2진수, 8진수, 16진수

2진수, 8진수, 10진수, 16진수의 개념과 변환 방법을 쉽게 설명해드릴게요. 컴퓨터 과학의 기초를 잡아보세요.

진법 변환 이해하기 — 2진수, 8진수, 16진수
🔢
진법 변환기 바로 사용하기
2진수, 8진수, 10진수, 16진수를 변환하세요

진법이 뭔지 10초 만에 이해하기

일상에서 쓰는 숫자는 10진법이에요. 0부터 9까지 10개 기호를 쓰고, 9를 넘으면 자릿수가 올라가요. 너무 당연해서 의식 안 하지만 이게 진법의 핵심이에요. 컴퓨터는 2진법을 써요. 전기 신호가 켜짐(1)·꺼짐(0) 두 상태뿐이거든요. 그래서 데이터·주소·이미지·소리 다 0과 1로 표현돼요. 16진법은 0~9에 A~F를 더해 16개 기호를 써요. 2진수 4자리를 16진수 한 자리로 줄여서 가독성이 좋거든요. CSS 색상 코드 #FF5733도 16진수예요. RR=FF(빨강 255) GG=57(녹색 87) BB=33(파랑 51). 8진법은 0~7만 써요. 옛날 PDP-11 같은 미니 컴퓨터에서 자주 썼고, 지금은 리눅스 파일 권한에서 살아남았어요.

각 진법이 쓰이는 곳

**2진수(Binary)** — 컴퓨터 내부 표현의 기본 네트워크 서브넷 마스크 255.255.255.0을 2진수로 풀면 11111111.11111111.11111111.00000000이에요. 앞 24비트가 네트워크, 뒤 8비트가 호스트라는 뜻이거든요. 이걸 이해해야 /24·/16·/8 같은 CIDR 표기가 와닿아요. **8진수(Octal)** — 리눅스 파일 권한 `chmod 755 file.sh`에서 7·5·5는 8진수예요. - 7 = 111 = rwx (읽기·쓰기·실행) - 5 = 101 = r-x (읽기·실행) - 0 = 000 = --- (없음) 3비트가 한 자리 8진수에 대응해서 권한 9개(소유자 3·그룹 3·기타 3)를 3자리 숫자로 깔끔하게 표현해요. **16진수(Hexadecimal)** — 웹 색상·메모리 주소·MAC CSS의 #RRGGBB, MAC 주소(00:1A:2B:3C:4D:5E), 메모리 주소(0x7FFFE000), JWT·OAuth 토큰의 randomBytes hex 인코딩까지 거의 모든 디지털 자취가 16진수로 표현돼요. 2진수 8자리(1바이트)가 16진수 2자리에 정확히 들어가서 한눈에 들어오거든요.

진법 변환하는 방법

**10진수 → 2진수**: 2로 나누고 나머지를 역순으로 읽기 13의 2진수 변환: - 13 ÷ 2 = 6 나머지 **1** - 6 ÷ 2 = 3 나머지 **0** - 3 ÷ 2 = 1 나머지 **1** - 1 ÷ 2 = 0 나머지 **1** → 역순으로 읽으면 **1101** **2진수 → 16진수**: 오른쪽부터 4자리씩 끊기 11010011 → 1101 0011 → **D3** - 1101 = 13 = D - 0011 = 3 **16진수 → 10진수**: 자릿값 × 16의 거듭제곱 FF = F × 16¹ + F × 16⁰ = 15 × 16 + 15 = **255** **10진수 → 8진수**: 8로 나누고 나머지 역순 493 ÷ 8 = 61 나머지 5, 61 ÷ 8 = 7 나머지 5, 7 ÷ 8 = 0 나머지 7 → **755** 손으로 한두 번 해보면 감이 오지만, 큰 숫자는 도구가 빨라요. 특히 -2147483648 같은 부호 있는 32비트 정수, 64비트 hex, 부동소수점 IEEE 754 비트 패턴 같은 건 손으로 못 하거든요.

프로그래밍에서 자주 만나는 진법 문제

현장에서 진법 헷갈려서 사고 나는 패턴이 몇 가지 있어요. **1. 색상 16진수 헷갈림** #FFF는 #FFFFFF의 축약형이에요. 3자리는 6자리로 자동 확장돼요. #FFA = #FFFFAA가 아니라 #FFFFAA·도 아니고 정확히는 #FFFFAA. 짧은 표기 쓸 때 의도한 색이랑 다르게 나오면 이걸 의심하세요. **2. chmod 권한 실수** `chmod 777`은 모든 사용자에게 모든 권한을 줘요. 보안상 절대 쓰지 마세요. 일반 파일은 644, 실행 파일·스크립트는 755, 비밀 키 파일은 600이 표준이에요. **3. 0x 접두사 빼먹기** C·Java·Python에서 16진수 리터럴은 `0xFF`처럼 0x를 붙여요. 안 붙이면 그냥 십진수 255가 아니라 변수 `FF`로 해석돼서 컴파일 에러나요. **4. 2진수 음수 표현(2의 보수)** 8비트 부호 있는 정수에서 -1은 11111111이에요. 0xFF로 보면 255인데 부호 있는 해석에서는 -1이에요. C/C++에서 `signed char`와 `unsigned char` 사이를 혼동하면 의도와 다른 값이 나오거든요. **5. 서브넷 마스크 계산** /26은 2진수로 11111111.11111111.11111111.11000000이에요. 호스트 비트가 6개라 2⁶ = 64개 IP에서 네트워크 주소·브로드캐스트 빼면 사용 가능 호스트는 62개예요. 이걸 외우지 말고 진법 변환으로 직접 계산하는 습관이 안전해요.

Toolkio 진법 변환기 사용법

Toolkio 진법 변환기는 입력하는 즉시 4가지 진법(2·8·10·16)이 동시에 갱신돼요. 1. 입력란에 숫자를 입력 (어떤 진법이든 상관없음) 2. 입력 진법 선택 (자동 감지도 가능) 3. 2진수·8진수·10진수·16진수 결과를 한눈에 비교 4. 클릭 한 번으로 복사 계산기 앱의 프로그래머 모드보다 직관적이에요. 4가지 진법을 한 화면에서 동시에 보여주거든요. 큰 숫자(64비트 정수, MAC 주소, UUID 일부)도 곧바로 처리해요. 공부 중인 학생부터 네트워크 엔지니어·임베디드 개발자까지 화면 한쪽에 띄워두면 손이 자주 가요.

지금 당장 할 수 있는 것

지금 자기 컴퓨터의 IP 주소와 서브넷 마스크를 변환기에 넣어 보세요. 어디까지가 네트워크고 어디부터 호스트인지 한눈에 보여요. 같은 네트워크 안에 몇 대의 기기가 들어갈 수 있는지도 바로 계산되거든요. CSS로 색 만지시면 자주 쓰는 브랜드 컬러 hex를 RGB·HSL로 변환해서 디자인 도구와 비교해 보세요. 채도(S)·명도(L) 값을 알면 톤 조정이 훨씬 직관적으로 가능해요.

프로그래밍 언어별 진법 변환 함수

현장에서 진법 변환할 일이 생기면 도구 켜기 전에 언어 내장 함수를 먼저 떠올려 보세요. 자주 쓰는 것만 정리할게요. **JavaScript** - 10진수 → 다른 진법: `(255).toString(2)` → '11111111', `(255).toString(16)` → 'ff' - 다른 진법 → 10진수: `parseInt('ff', 16)` → 255, `parseInt('11111111', 2)` → 255 - 16진수 리터럴: `0xFF` → 255 - 16진수 ↔ 바이트 배열: `Uint8Array.from(Buffer.from('ff', 'hex'))` (Node.js) **Python 3** - 10진수 → 다른 진법: `bin(255)` → '0b11111111', `hex(255)` → '0xff', `oct(8)` → '0o10' - 다른 진법 → 10진수: `int('ff', 16)` → 255, `int('0b11111111', 2)` → 255 - 자릿수 패딩: `format(255, '08b')` → '11111111' (8자리) - f-string: `f'{255:#x}'` → '0xff' **Java** - `Integer.toBinaryString(255)` → '11111111' - `Integer.toHexString(255)` → 'ff' - `Integer.parseInt('ff', 16)` → 255 - 16진수 리터럴: `0xFF` **Go** - `strconv.FormatInt(255, 16)` → 'ff' - `strconv.ParseInt('ff', 16, 64)` → 255 - `fmt.Sprintf('%b', 255)` → '11111111' **Rust** - `format!('{:b}', 255)` → '11111111', `format!('{:x}', 255)` → 'ff' - `i32::from_str_radix('ff', 16).unwrap()` → 255 공통 함정: JavaScript의 `parseInt('08')`은 환경에 따라 0이 나올 수 있어요. ECMAScript 5 이전 엔진은 0으로 시작하면 8진수로 해석했거든요. 항상 두 번째 인자로 진수를 명시하세요(`parseInt('08', 10)`). Python의 `int('08')`은 다행히 항상 10진수로 해석돼요(8진수는 '0o' 접두사 필수).

비트 연산과 진법 — 실전 활용

진법을 알면 비트 연산이 직관적으로 보여요. 자주 쓰는 패턴 정리할게요. **1. 권한 플래그 합치기/검사 — 비트 마스크** 리눅스 권한 외에도 게임 스킬·기능 플래그·이벤트 플래그에 비트 마스크를 자주 써요. 4개 권한이 있다고 해 봐요. - READ = 0001 (1) - WRITE = 0010 (2) - DELETE = 0100 (4) - ADMIN = 1000 (8) 관리자 + 읽기 권한 = `READ | ADMIN` = 1001 (9). 권한 검사는 `(perm & READ) === READ`로 해요. AND 연산이 0이 아니면 그 비트가 켜져 있다는 뜻이거든요. DB 컬럼 1개에 64개 플래그까지 압축할 수 있어서 인덱스도 가벼워져요. **2. 색상 분리 — 16진수 RGB** CSS `#FF5733`을 R·G·B 각각 추출하려면 비트 시프트를 써요. - `(0xFF5733 >> 16) & 0xFF` → 0xFF (R, 255) - `(0xFF5733 >> 8) & 0xFF` → 0x57 (G, 87) - `0xFF5733 & 0xFF` → 0x33 (B, 51) 반대로 합치는 건 `(R << 16) | (G << 8) | B`. 이미지 처리·Canvas API에서 자주 보는 패턴이에요. **3. IP 주소 ↔ 정수 변환** IPv4 주소 192.168.1.1을 단일 정수로 표현하면 `(192 << 24) | (168 << 16) | (1 << 8) | 1` = 3232235777이에요. DB에 INT로 저장하면 문자열보다 4배 작고 범위 검색도 빨라요. 후술할 서브넷 비교도 비트 마스크 연산 한 줄로 끝나거든요. **4. CIDR 서브넷 검사** 어떤 IP가 192.168.1.0/24 안에 들어가는지 확인하려면 두 IP를 정수로 바꾼 뒤 마스크와 AND. `/24`는 위 24비트 마스크 = 0xFFFFFF00. `(target & 0xFFFFFF00) === (192.168.1.0 & 0xFFFFFF00)`이면 같은 서브넷이에요. 방화벽·rate limiter 구현에 그대로 쓰여요. 비트 연산이 처음엔 어려워 보여도, 진법을 익히면 '아 이 숫자가 이런 의미구나' 하고 풀려요. 변환기로 한 줄씩 연습하면서 손에 익히는 게 가장 빨라요.

음수·소수·부동소수점 — 단순한 진법 변환을 넘어서

정수 양수의 진법 변환은 직관적이지만, 음수나 소수가 들어가면 갑자기 어려워져요. 자주 헷갈리는 부분만 정리할게요. **1. 음수의 2진수 표현 — 2의 보수** 컴퓨터는 음수를 부호 비트와 절댓값으로 따로 저장하지 않고 '2의 보수' 방식을 써요. -1을 8비트로 표현하면 11111111이에요. 어떻게 나오냐면, 1의 2진수 00000001을 비트 반전(11111110) 후 1을 더해서(11111111) 만들어요. **왜 이렇게 복잡하게 하냐면**, 덧셈 회로 하나로 양수·음수 연산을 다 처리할 수 있거든요. -1 + 1을 계산하면 11111111 + 00000001 = 100000000 → 8비트 범위를 넘는 1은 버려서 00000000 = 0. 단순한 회로로 부호 처리가 자동 해결돼요. 실전 함정은 '오버플로우' — 8비트 부호 있는 정수의 최댓값은 127인데 +1 하면 -128로 돌아가요. C/C++의 정의되지 않은 동작(undefined behavior)이 여기서 자주 터지고, Java도 silent overflow가 일어나요. Rust는 디버그 빌드에서 panic, 릴리즈 빌드에서 wrap-around예요. 이런 경계값 사고는 도구 변환기로 16진수·2진수 표현을 미리 확인하는 습관만 들이면 거의 잡혀요. 코드 작성 전에 한 번씩 진법으로 풀어 보면 의심 가는 부분이 빠르게 드러나거든요. **2. 소수의 2진수 표현** 0.1을 2진수로 정확히 표현할 수 없어요. 십진수 1/3을 십진수로 정확히 못 적는 것과 같은 이유예요. 0.1의 2진수는 0.0001100110011...로 무한 순환소수예요. 그래서 IEEE 754 부동소수점 표준은 가장 가까운 근사값을 저장해요. JavaScript에서 `0.1 + 0.2 === 0.30000000000000004`가 나오는 게 이 때문이에요. 금융 계산에서는 절대 부동소수점 쓰면 안 되고, 정수(센트 단위)나 BigDecimal·decimal 라이브러리를 쓰세요. **3. IEEE 754 — 32비트 float, 64비트 double** 32비트 부동소수점은 부호 비트 1 + 지수 8 + 가수 23으로 쪼개져 있어요. 0.15625를 32비트 float로 표현하면 0 01111100 01000000000000000000000이에요. 부호 0(양수) / 지수 124(편향 127 적용) / 가수 0.0100... → 1.01 × 2^(-3) = 0.15625. 이걸 16진수로 묶으면 0x3E200000. 디버깅할 때 부동소수점 비트 패턴을 봐야 할 일이 생기면(주로 NaN·Infinity 추적) 진법 변환기에 그대로 넣어 풀어 볼 수 있어요. C에서 `union { float f; uint32_t i; }` 트릭, JavaScript에서 `new Float32Array(buffer)` + `new Uint32Array(buffer)` 공유 패턴이 표준이에요. **4. BCD(Binary-Coded Decimal)** 계산기·POS 시스템·금융 단말처럼 십진수 정확도가 중요한 곳은 BCD를 써요. 십진수 한 자리(0~9)를 4비트에 그대로 매핑해서 0010 0011은 23. 16진수처럼 보이지만 A~F는 못 써요. 손해를 보더라도 정확도를 챙기는 분야 표준이에요. 메인프레임 COBOL이 여전히 BCD를 표준으로 쓰는 이유도 이거고요. 은행 거래 정산처럼 단 한 푼도 어긋나면 안 되는 시스템에서 부동소수점 대신 BCD를 고집하는 건 단순한 관성이 아니라 실제 안전성 때문이에요. 현대 시스템에서 같은 효과를 내고 싶으면 Java의 BigDecimal, Python의 Decimal, JavaScript의 decimal.js 같은 임의 정밀도 십진수 라이브러리를 쓰면 돼요. 성능은 정수 연산보다 5~10배 느리지만 금액·세금처럼 정확도가 더 중요한 영역에는 그만한 비용을 지불할 가치가 있어요.

지금 바로 진법 변환기를 사용해보세요

무료이며, 브라우저에서 바로 실행됩니다.

진법 변환기