진법 변환기

2·8·10·16진 변환 + 비트 시각화 + 2의 보수·ASCII·비트 연산.

2026년 9월 기준 점검정수는 임의 정밀도(BigInt)로 계산 · 부동소수점은 IEEE 754-2019, 문자 코드는 ASCII(RFC 20)·Unicode 17.0, 서브넷은 CIDR(RFC 4632) 기준출처 IEEE 754-2019 부동소수점 표준(새 창) ·Unicode 17.0(새 창) ·RFC 20 ASCII(새 창) ·RFC 4632 CIDR(새 창) ·W3C PNG 명세(파일 시그니처)(새 창)작성 리만 (Youtil 운영자)

참고: 정수 변환을 지원합니다. 부동소수점(IEEE 754) 변환은 별도 도구를 권장하며, 실제 시스템 구현 시 비트 폭·엔디안·부호 처리에 따라 결과가 다를 수 있습니다. 진법 변환은 자릿수 제한 없이 정확하게(BigInt) 계산하고, 비트 표현·연산은 선택한 비트 폭(8~64-bit)에 맞춰 넘치는 상위 비트를 버리고 계산합니다.
2진수 (Binary)0b

1111 1111

8진수 (Octal)0o

377

10진수 (Decimal)—

255

16진수 (Hex)0x

FF

의미:
  • 255 — 8비트 부호 없는 최대값 (2⁸ − 1)
C / C++ / Java0xFF0b111111110377
Python0xff0b111111110o377
JavaScript0xFF0b111111110o377
CSS 색상#0000FF——
색상 코드: #0000FF   색상 코드 변환기에서 보기 →
가이드

알아두면 좋은 내용

리만 작성 · Youtil 운영자 소개
최종 업데이트 2026.09.26 · 읽는 시간 약 14분

이 변환기의 입력 규칙과 계산 방식

진법 변환 탭은 입력을 먼저 정리합니다 — 앞뒤·중간 공백과 밑줄(_)을 지우고, 선택한 진법에 맞는 접두사(0x·0b·0o)와 16진수의 #을 떼어 냅니다. 그래서 코드에서 복사한 0xFF, 4비트씩 띄어 쓴 1111 0000, 색상 코드 #FF8800을 그대로 붙여 넣어도 됩니다. 음수 부호는 10진수 입력에서만 받습니다. 계산은 자바스크립트 Number가 아니라 BigInt(임의 정밀도 정수)로 하므로 2⁵³을 넘는 값도 한 자리도 틀리지 않습니다. 아래 표는 이 도구의 파싱 함수로 계산한 결과입니다.

입력선택 진법10진수16진수2진수
0xFF16진수255FF11111111
1111 00002진수240F011110000
1010_10102진수170AA10101010
#FF880016진수16746496FF8800111111111000100000000000
0o7558진수4931ED111101101
1844674407370955161510진수18446744073709551615FFFFFFFFFFFFFFFF1111111111111111111111111111111111111111111111111111111111111111

마지막 행은 64비트 부호 없는 정수의 최댓값(2⁶⁴ − 1)입니다. 같은 값을 자바스크립트 Number로 바꾸면 18446744073709552000이 되어 끝자리가 달라집니다 — Number는 IEEE 754 배정밀도라 2⁵³(9,007,199,254,740,992)을 넘는 정수를 정확히 담지 못하기 때문입니다. 데이터베이스의 64비트 ID나 해시값을 다룰 때 이 차이로 값이 바뀌는 사고가 흔합니다.

실무 HEX 덤프 읽기 — 파일 시그니처(매직 넘버)

확장자를 지워도 파일 종류를 알아낼 수 있는 이유는, 대부분의 파일 포맷이 첫머리 몇 바이트에 고유한 식별자(매직 넘버)를 규격으로 못 박아 두기 때문입니다. 업로드 파일의 확장자 위조 검사, 다운로드가 중간에 깨졌는지 확인, 리눅스 file 명령의 포맷 판별이 전부 이 원리로 동작합니다. 16진수 읽기가 실무에서 가장 자주 쓰이는 곳이 바로 이 HEX 덤프입니다.

포맷시그니처 (HEX)ASCII로 읽으면
PNG89 50 4E 47 0D 0A 1A 0A.PNG.... — "PNG" 문자 + 전송 손상 감지용 바이트
JPEGFF D8 FFSOI 마커 (JFIF는 FF D8 FF E0, EXIF는 FF D8 FF E1)
ZIP50 4B 03 04"PK.." — DOCX·XLSX·APK·JAR도 ZIP 기반이라 동일
PDF25 50 44 46 2D"%PDF-"
GIF47 49 46 38"GIF8" (GIF87a·GIF89a)
ELF7F 45 4C 46".ELF" — 리눅스 실행 파일

직접 확인하는 절차

  • macOS·리눅스: 터미널에서 xxd 파일명 | head -1 — 첫 16바이트가 HEX와 ASCII로 나란히 출력됩니다
  • 윈도우: HxD 같은 헥스 에디터로 열어 첫 줄을 위 표와 대조하면 됩니다
  • PNG의 첫 바이트 89를 위 변환기에 넣으면 10001001 — 최상위 비트가 1인 비(非)ASCII 값입니다. 7비트 채널로 잘못 전송되면 이 비트가 깎여 시그니처가 깨지므로, 손상을 즉시 알아채도록 PNG 규격이 일부러 고른 값입니다. 뒤따르는 0D 0A(CR LF)와 0A(LF)도 줄바꿈 변환을 감지하는 용도입니다
  • ZIP의 PK(50 4B)는 PKZIP 개발자 필 카츠(Phil Katz)의 이니셜입니다

진법 간 단축 변환 관계

2진수 ↔ 16진수 (가장 자주)

2진수 4자리 = 16진수 1자리
0000 = 0 / 0001 = 1 / 1010 = A / 1111 = F
8비트(1바이트) = 16진수 2자리 (예: 0xFF)

2진수 ↔ 8진수

2진수 3자리 = 8진수 1자리
000 = 0 / 111 = 7
Unix 권한(rwx)에 자주 사용 (chmod 755)

이 대응 관계 덕분에 2진수를 16진수로 바꿀 때는 나눗셈이 필요 없습니다. 오른쪽 끝부터 4자리씩 끊어 각 묶음을 한 글자로 바꾸면 됩니다 — 1111 1000 1000 0000 → F·8·8·0 → 0xF880. 8진수는 3자리씩 끊습니다. 111 101 101 → 7·5·5 → 0o755이고, 이것이 곧 rwx r-x r-x 권한입니다. 10진수와의 변환만 자리값 계산(또는 나눗셈 반복)이 필요하며, 이 도구의 ‘계산 과정 학습’ 탭이 그 과정을 단계별로 보여 줍니다.

비트 폭별 표현 범위

비트부호 없는 최대16진수부호 있는 최소부호 있는 최대
8-bit (1B)2550xFF-128127
16-bit (2B)65,5350xFFFF-32,76832,767
32-bit (4B)4,294,967,2950xFFFFFFFF-2,147,483,6482,147,483,647
64-bit (8B)18,446,744,073,709,551,6150xFFFFFFFFFFFFFFFF-9,223,372,036,854,775,8089,223,372,036,854,775,807

부호 있는 범위가 음수 쪽으로 하나 더 긴 것(−128 ~ 127)은 2의 보수에서 0이 양수 쪽 자리를 하나 차지하기 때문입니다. 자주 쓰는 2의 거듭제곱은 2⁸ = 256(1바이트), 2¹⁰ = 1,024(1KiB), 2¹⁶ = 65,536(포트 번호 0~65,535, 유니코드 기본 다국어 평면), 2²⁰ = 1,048,576(1MiB), 2³² = 4,294,967,296(IPv4 주소 전체 개수)입니다.

IPv4 주소·서브넷을 진법으로 읽기

192.168.0.1 같은 IP 주소는 사실 32비트 2진수 하나를 8비트씩 네 토막 내어 10진수로 적은 것입니다. 서브넷 마스크와 CIDR 표기(/24)가 어렵게 느껴진다면, 진법으로 풀어서 보는 것이 가장 빠른 이해법입니다.

# 192.168.0.1 을 32비트로 분해
192.168.0.1 = 11000000.10101000.00000000.00000001
# /24 = 앞 24비트가 네트워크, 뒤 8비트가 호스트
255.255.255.0 = 11111111.11111111.11111111.00000000
CIDR서브넷 마스크전체 주소사용 가능 호스트
/24255.255.255.0256254
/25255.255.255.128128126
/26255.255.255.1926462
/28255.255.255.2401614
/30255.255.255.25242
왜 2ⁿ − 2인가
호스트 비트가 전부 0인 주소는 네트워크 자체를, 전부 1인 주소는 브로드캐스트를 가리키므로 장비에 배정할 수 없습니다. "같은 서브넷인가?" 판정도 결국 비트 연산입니다 — IP AND 마스크의 결과가 서로 같으면 같은 네트워크입니다. 예를 들어 /25에서 192.168.0.130은 마지막 옥텟 130 = 10000010의 최상위 비트가 1이므로 192.168.0.128~255 쪽 서브넷에 속합니다. (점대점 링크용 /31은 RFC 3021에 따라 예외적으로 두 주소를 모두 씁니다.)

2의 보수 (Two's Complement)

컴퓨터가 음수를 비트로 표현하는 표준 방식입니다. 규칙은 “양수의 비트를 모두 뒤집고 1을 더한다” 하나뿐이고, 결과를 부호 없이 읽으면 2ⁿ − |값|이 됩니다. 아래 8비트 예시는 변환기의 ‘비트 표현·연산’ 탭에 같은 값을 넣어 확인할 수 있습니다.

부호 있는 값8비트 2의 보수부호 없이 읽으면16진수
127011111111270x7F
50000010150x05
-1111111112550xFF
-5111110112510xFB
-128100000001280x80

최상위 비트(MSB)가 1이면 음수입니다. 같은 11111011이 부호 있는 정수로는 −5, 부호 없는 정수(uint8)로는 251인 것처럼, 비트 자체에는 부호 정보가 없고 해석 방식이 값을 정한다는 점이 핵심입니다. C·Java에서 부호 있는 바이트를 다른 정수형으로 옮길 때 0xFB가 251이 아니라 −5가 되는(부호 확장) 버그가 여기서 생깁니다.

IEEE 754 부동소수점 — 0.1 + 0.2 ≠ 0.3인 이유

브라우저 콘솔에 0.1 + 0.2를 입력하면 0.30000000000000004가 나옵니다. 버그가 아니라 소수를 2진수 비트로 저장하는 IEEE 754 표준의 정상 동작입니다. 1/3을 10진수로 정확히 적을 수 없듯이(0.3333…), 분모에 5가 들어 있는 0.1(= 1/10)은 2진수로 무한 반복 소수가 되어 유한한 비트에 담는 순간 반올림 오차가 생깁니다.

# 10진수 0.1 → 2진수: 0011 이 무한 반복
0.1 = 0.000110011001100110011...₂
# 64비트에 잘라 담긴 실제 값 (반올림 오차)
0.1 → 0.1000000000000000055511151231...
0.1 + 0.2 → 0.30000000000000004
형식부호지수가수(유효숫자)유효 십진 자릿수
float32 (단정밀도)1비트8비트23비트약 7자리
float64 (배정밀도)1비트11비트52비트약 15~16자리

실무 대처법

  • 금액 계산은 부동소수점 대신 정수(원 단위)로 처리하고 표시할 때만 변환
  • 1 부근 값의 동등 비교는 === 대신 Math.abs(a - b) < Number.EPSILON — 큰 수는 허용 오차를 값 크기에 비례시킬 것
  • 분모가 2의 거듭제곱인 소수(0.5, 0.25, 0.125)는 오차 없이 정확히 저장됨 — 0.25 + 0.25 === 0.5 는 true
  • 정수도 2⁵³ = 9,007,199,254,740,992를 넘으면 모든 정수를 표현하지 못함 — JS의 Number.MAX_SAFE_INTEGER(2⁵³ − 1)를 넘으면 BigInt 사용

이 변환기는 정수 전용입니다. 소수점이 있는 값의 2진 표현(부호·지수·가수 비트)을 직접 분해하는 기능은 없습니다.

비트 연산 활용 가이드

연산동작활용 예시
AND (&)둘 다 1일 때만 1마스킹 — 0xFF & 0x0F = 0x0F (하위 4비트만 추출)
OR (|)하나라도 1이면 1비트 설정 — 0x10 | 0x01 = 0x11 (특정 비트 ON)
XOR (^)다르면 1, 같으면 0토글 — 같은 값으로 두 번 XOR하면 원래 값
NOT (~)0↔1 반전비트 반전, 마스크 생성 (flags & ~READ = READ 끄기)
LSHIFT (<<)왼쪽 이동x << n = x × 2ⁿ (비트 폭을 넘친 상위 비트는 버려짐)
RSHIFT (>>)오른쪽 이동양수 x >> n = x ÷ 2ⁿ의 몫

이 변환기의 비트 연산은 선택한 비트 폭 안에서 부호 없는 값으로 계산하고, 시프트는 빈자리를 0으로 채우는 논리 시프트입니다. 그래서 8비트에서 −8 RSHIFT 1은 11111000을 오른쪽으로 민 01111100 = 124이 되고, 200 LSHIFT 1은 넘친 비트가 잘려 144이 됩니다(400 − 256). 반면 자바스크립트의 -8 >> 1은 부호를 유지하는 산술 시프트라 −4, -8 >>> 1은 32비트 논리 시프트라 2,147,483,644입니다. 결과를 코드와 대조할 때는 언어의 비트 폭과 시프트 종류를 먼저 맞추세요.

  • 플래그 관리: flags |= READ; if (flags & READ) ...
  • Linux 파일 권한: chmod 755 = 0o755 = 111 101 101 = rwxr-xr-x
  • RGB 채널 분리: r = (color >> 16) & 0xFF
  • 자바스크립트의 비트 연산자는 피연산자를 32비트 정수로 잘라 계산합니다. 2³¹ 이상의 값에 |·&를 쓰면 값이 바뀌므로, 큰 수는 BigInt(BigInt(x) & BigInt(0xFF))로 계산하세요

ASCII 표준

ASCII(American Standard Code for Information Interchange)는 1963년 미국 표준으로 처음 제정된 7비트, 128자문자 집합입니다. 1963년판에는 소문자가 없었고, 소문자가 들어간 지금의 배치는 1967년 개정판에서 완성되었습니다(RFC 20이 옮겨 실은 것도 이 개정 배치). 128~255번을 쓰는 ‘확장 ASCII’는 하나의 표준이 아니라 ISO 8859-1(서유럽 라틴 문자), 코드 페이지 437(도스) 등 규격마다 배정이 다릅니다. 이 도구의 ASCII 표에서 ‘확장 보기’로 보이는 128~255는 유니코드 U+0080~U+00FF(= ISO 8859-1 배치)이며, 그중 128~159는 화면에 보이지 않는 C1 제어 문자입니다.

0~31

제어 문자

NUL, TAB(9), LF(10), CR(13), ESC(27) 등

32

공백 (SPACE)

문자열 구분

48~57

숫자 0~9

ord('0') = 48 = 0x30

65~90

대문자 A~Z

ord('A') = 65 = 0x41

97~122

소문자 a~z

ord('a') = 97 (대문자 + 32)

127

DEL

천공 테이프의 구멍을 모두 뚫어 글자를 지우던 흔적

대문자와 소문자의 차이가 정확히 32(= 0x20, 2진수로 여섯 번째 비트 하나)라는 점이 설계의 흔적입니다. 'A'(01000001)와 'a'(01100001)는 비트 하나만 다르므로, 옛 시스템은 이 비트를 XOR로 뒤집어 대소문자를 바꿨습니다. 숫자 문자도 ‘0’이 0x30에서 시작해 문자 − 0x30(또는 & 0x0F)이 곧 숫자 값입니다. 유니코드의 U+0000~U+007F는 ASCII와 번호가 같고, 한글 완성형 음절은 U+AC00 ~ U+D7A3에 11,172자(가~힣)가 들어 있습니다.

프로그래밍 언어별 진법 표기

언어16진수2진수8진수
C0xFF0b11111111 (C23부터 표준)0377 (앞에 0)
C++0xFF0b11111111 (C++14+)0377
Java0xFF0b11111111 (Java 7+)0377
Python 30xff0b111111110o377 (0377은 문법 오류)
JavaScript / TS0xFF0b111111110o377 (0377은 엄격 모드 오류)
Rust0xFF0b1111_11110o377
Go0xFF0b1111_1111 (Go 1.13+)0o377 또는 0377
CSS 색상#FF0000——
HTML 문자 참조&#x41;——
URL 인코딩%41——

앞에 0을 붙이면 8진수가 되는 C 계열 규칙은 흔한 함정입니다 — C·Java에서 010은 10이 아니라 8입니다. 그래서 Python 3와 자바스크립트 엄격 모드는 이 표기를 금지하고 0o 접두사만 허용합니다. 밑줄(1111_1111)은 Java 7·Python 3.6·Rust·Go 1.13 이상과 JS(ES2021)에서 자릿수 구분자로 쓸 수 있고, C++14와 C23은 작은따옴표(0b1111'1111)를 씁니다.

자주 묻는 질문

왜 16진수를 자주 사용하나요?
16 = 2⁴라서 16진수 한 자리가 정확히 2진수 4자리에 대응하기 때문입니다. 1바이트(8비트)는 16진수 두 자리로 딱 떨어지므로, 메모리 주소·색상 코드(#RRGGBB)·HEX 덤프·해시값처럼 바이트 단위 데이터를 사람이 읽을 때 표준처럼 쓰입니다. 11111111보다 0xFF가 짧고, 자리를 4비트씩 끊어 읽으면 암산 없이 2진수로 되돌릴 수 있습니다(F = 1111, 8 = 1000 → 0xF8 = 11111000).
2의 보수는 왜 사용하나요?
음수를 비트로 표현하는 방식 중 회로가 가장 단순하기 때문입니다. ① 0의 표현이 하나뿐이고(부호+절댓값·1의 보수 방식은 +0과 −0이 따로 생김), ② 덧셈 회로 하나로 뺄셈까지 처리하며(a − b = a + (−b)), ③ 부호를 바꾸는 방법이 "비트 반전 후 +1"로 간단합니다. 8비트에서 −5는 5(00000101)를 반전(11111010)한 뒤 1을 더한 11111011이고, 같은 비트를 부호 없이 읽으면 251(= 256 − 5)입니다. 현대 CPU와 대부분의 언어가 정수에 이 방식을 씁니다.
ASCII와 유니코드의 차이는 무엇인가요?
ASCII는 1963년 미국 표준으로 처음 제정되고 1967년 개정에서 소문자가 추가되어 지금의 7비트, 128자(제어 문자 33개 + 출력 문자 95개)가 된 문자 집합입니다. 유니코드는 전 세계 문자를 하나의 번호 체계로 모은 표준으로, 2025년 9월 공개된 Unicode 17.0 기준 159,801자를 정의합니다(최근에는 매년 9월 새 버전이 나오며 글자 수가 늘어납니다). 유니코드의 U+0000~U+007F는 ASCII와 번호가 같아 호환되며, 한글 완성형 음절은 U+AC00~U+D7A3에 11,172자(초성 19 × 중성 21 × 종성 28)가 배치되어 있습니다.
비트 연산은 언제 사용하나요?
① 플래그: 여러 on/off 옵션을 정수 하나에 담고 OR로 켜고 AND로 확인, ② 마스킹: 특정 비트만 추출(x & 0x0F), ③ 권한: 리눅스 파일 권한 755는 8진수 한 자리씩 rwx 3비트, ④ 색상·바이너리 포맷: (color >> 16) & 0xFF로 빨강 채널 분리, ⑤ 체크섬·해시: XOR 누적. 곱셈·나눗셈을 시프트로 바꾸는 최적화는 요즘 컴파일러가 알아서 하므로, 가독성을 해치면서까지 직접 쓸 이유는 거의 없습니다.
0.1 + 0.2가 0.30000000000000004로 나오는데 버그인가요?
버그가 아니라 IEEE 754 부동소수점 표준의 정상 동작입니다. 10진수 0.1은 2진수로 무한 반복 소수(0.000110011…)여서 64비트에 담는 순간 미세한 반올림 오차가 생깁니다. 실무 회피법: ① 금액은 원 단위 정수로 계산, ② 1 부근 값의 비교는 Math.abs(a - b) < Number.EPSILON(큰 수는 허용 오차를 값 크기에 비례시켜야 정확), ③ 화면 표시 단계에서만 toFixed() 사용. 참고로 0.5·0.25처럼 분모가 2의 거듭제곱인 소수는 오차 없이 정확하게 저장됩니다.
16진수에서 A~F는 무엇을 의미하나요?
16진수는 한 자리에 0~15를 담아야 하는데 숫자 기호는 0~9뿐이라 알파벳을 빌려 A=10, B=11, C=12, D=13, E=14, F=15로 씁니다. 예를 들어 0xFF = 15 × 16 + 15 = 255입니다. 대문자와 소문자는 같은 값이며, 이 변환기는 결과를 대문자로 표시하고 입력은 둘 다 받습니다.

참고 자료

  1. IEEE 754-2019 부동소수점 표준(새 창)standards.ieee.org
  2. Unicode 17.0(새 창)unicode.org
  3. RFC 20 ASCII(새 창)rfc-editor.org
  4. RFC 4632 CIDR(새 창)rfc-editor.org
  5. W3C PNG 명세(파일 시그니처)(새 창)w3.org
이 계산기를 만든 사람 · 리만Youtil 운영자 · 혼자 만들고 운영하는 1인 서비스입니다
운영자 소개
계산 기준
정수는 임의 정밀도(BigInt)로 계산 · 부동소수점은 IEEE 754-2019, 문자 코드는 ASCII(RFC 20)·Unicode 17.0, 서브넷은 CIDR(RFC 4632) 기준
오류 제보
결과가 다르면 contact@youtil.kr로 입력 조건을 알려 주세요. 평일 기준 1~3일 안에 답변합니다.

함께 쓰면 좋은 계산기