개발자
🔢 진법 변환기
2진수·8진수·10진수·16진수를 실시간으로 상호 변환합니다. 비트 토글 시각화·2의 보수·ASCII·비트 연산(AND/OR/XOR/SHIFT) + 자리값 분해와 나누기 방식 단계별 학습까지 한 도구에서.
1111 1111
377
255
FF
- 255 — 8비트 부호 없는 최대값 (2⁸ − 1)
| C / C++ / Java | 0xFF | 0b11111111 | 0377 |
| Python | 0xff | 0b11111111 | 0o377 |
| JavaScript | 0xFF | 0b11111111 | 0o377 |
| CSS 색상 | #0000FF | — | — |
#0000FF 색상 코드 변환기에서 보기 →진법 변환 핵심 원리
- N진수 → 10진수: 각 자리에 자리값 곱하고 합산 (1011₂ = 1×8 + 0×4 + 1×2 + 1×1 = 11)
- 10진수 → N진수: N으로 계속 나누고 나머지를 역순 배열
진법 간 단축 변환 관계
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)
0xFF가11111111보다 훨씬 읽기 쉽습니다.비트 폭별 표현 범위
| 비트 | 부호 없는 최대 | 부호 있는 범위 |
|---|---|---|
| 8-bit (1B) | 255 | −128 ~ 127 |
| 16-bit (2B) | 65,535 | −32,768 ~ 32,767 |
| 32-bit (4B) | 약 42억 | −약 21억 ~ 약 21억 |
| 64-bit (8B) | 약 1.8 × 10¹⁹ | −9.2 × 10¹⁸ ~ 9.2 × 10¹⁸ |
- 2⁸ = 256 (1바이트)
- 2¹⁰ = 1,024 (1KiB)
- 2¹⁶ = 65,536 (UTF-16 BMP, 16비트 포트)
- 2²⁰ = 1,048,576 (1MiB)
- 2³² = 약 42억 (32-bit 정수 한계, IPv4 주소)
2의 보수 (Two's Complement)
컴퓨터가 음수를 비트로 표현하는 가장 효율적인 방법입니다. 거의 모든 현대 CPU·언어에서 표준으로 사용됩니다.
✓ 장점 1
0이 단 하나 (+0과 −0이 분리되지 않음, 부호+절대값 방식과 다름)
✓ 장점 2
덧셈·뺄셈을 같은 회로로 처리 (a − b = a + (−b))
✓ 장점 3
비트 반전 후 +1로 매우 간단히 변환
비트 연산 활용 가이드
| 연산 | 동작 | 활용 예시 |
|---|---|---|
| AND (&) | 둘 다 1일 때만 1 | 마스킹 — 0xFF & 0x0F = 0x0F (하위 4비트만 추출) |
| OR (|) | 하나라도 1이면 1 | 비트 설정 — 0x10 | 0x01 = 0x11 (특정 비트 ON) |
| XOR (^) | 다르면 1, 같으면 0 | 토글·암호화 — 같은 값 두 번 XOR하면 원복 |
| NOT (~) | 0↔1 반전 | 비트 반전, 마스크 생성 |
| LSHIFT (<<) | 왼쪽 이동 | x << 1 = x × 2 (빠른 곱셈) |
| RSHIFT (>>) | 오른쪽 이동 | x >> 1 = x ÷ 2 (정수 나눗셈) |
- 플래그 관리 (여러 옵션을 한 변수에):
flags |= READ; if (flags & READ) ... - Linux 파일 권한 (chmod 755 = 0o755 = rwxr-xr-x)
- RGB 채널 분리:
r = (color >> 16) & 0xFF - 비트 연산은 일반 산술보다 훨씬 빠름 — 성능 최적화
ASCII 표준
ASCII = American Standard Code for Information Interchange (1963년 제정). 7비트로 영어·숫자·기본 기호 128개를 표현하는 표준이며, 8비트 확장 ASCII는 256개를 다룹니다.
0~31
제어 문자
NUL, TAB(9), LF(10), CR(13), ESC(27) 등
32
공백 (SPACE)
문자열 구분
48~57
숫자 0~9
ord('0') = 48
65~90
대문자 A~Z
ord('A') = 65
97~122
소문자 a~z
ord('a') = 97 (대문자+32)
127
DEL
구식 천공카드 삭제 표시
U+AC00 ~ U+D7A3 범위에 11,172개가 정의 (가~힣).프로그래밍 언어별 진법 표기
| 언어 | 16진수 | 2진수 | 8진수 |
|---|---|---|---|
| C / C++ / Java | 0xFF | 0b11111111 (C++14+) | 0377 (앞 0) |
| Python | 0xff | 0b11111111 | 0o377 |
| JavaScript / TS | 0xFF | 0b11111111 | 0o377 |
| Rust / Go | 0xFF | 0b1111_1111 | 0o377 |
| CSS 색상 | #FF0000 | — | — |
| HTML 엔터티 | A | — | — |
| URL 인코딩 | %41 | — | — |
자주 묻는 질문 (FAQ)
Q1. 왜 16진수를 자주 사용하나요?
2진수는 길어서 사람이 읽기 어렵지만, 16진수는 짧고 직관적이기 때문입니다. 8비트(1바이트)는 16진수 2자리로 표현되며, 메모리 주소·색상 코드·암호화 키 등에 표준입니다. 또한 16진수와 2진수는 4비트 단위로 직접 변환되어 (1111 = F) 비트 패턴 분석에 매우 편리합니다. 0xFF가 11111111보다 훨씬 읽기 쉽습니다.
Q2. 2의 보수는 왜 사용하나요?
컴퓨터에서 음수를 표현하는 가장 효율적인 방법이기 때문입니다. ① 0이 단 하나(+0과 −0이 구분 X), ② 덧셈·뺄셈을 같은 회로로 처리(a − b = a + (−b)), ③ 비트 반전 후 +1로 간단히 변환. 거의 모든 현대 CPU·프로그래밍 언어에서 표준으로 사용합니다. 부호+절대값 방식이나 1의 보수 방식은 0의 표현이 두 가지가 되거나 회로가 복잡해 거의 쓰이지 않습니다.
Q3. ASCII와 유니코드의 차이는 무엇인가요?
ASCII는 7비트로 영어·숫자·기본 기호 128개를 표현하는 표준입니다(1963년 제정). 유니코드는 전 세계 모든 문자를 표현하기 위해 ASCII를 확장한 표준이며, 약 14만 개 이상의 문자(한글·한자·이모지 포함)를 정의합니다. ASCII 0~127번은 유니코드와 완전히 동일하므로 ASCII 호환성이 보장됩니다. 한글은 U+AC00 ~ U+D7A3 범위에 11,172개가 정의되어 있습니다.
Q4. 비트 연산은 언제 사용하나요?
비트 연산은 다음 상황에 자주 사용됩니다: ① 플래그 관리(여러 옵션을 한 변수에 OR로 설정·AND로 확인), ② 마스킹(특정 비트만 추출), ③ 빠른 곱셈·나눗셈(x << 1 = x×2), ④ 권한 시스템(Linux 파일 권한 0o755), ⑤ 암호화·해시(XOR 활용), ⑥ 그래픽 처리(RGB 채널 분리). 비트 연산은 일반 산술 연산보다 훨씬 빠르므로 성능 최적화에도 사용됩니다.
Q5. 16진수에서 A~F는 무엇을 의미하나요?
16진수는 0~15까지 16개 숫자를 사용하는 진법이지만, 한 자리에 두 자리 숫자(10~15)를 넣을 수 없어 알파벳을 빌려 사용합니다: A=10, B=11, C=12, D=13, E=14, F=15. 예를 들어 0xFF = 15 × 16 + 15 = 255입니다. 관습상 대문자(A~F)와 소문자(a~f) 모두 허용되며 같은 값을 의미합니다. CSS 색상은 대문자가 일반적이고, Python·Rust 등은 소문자를 선호합니다.