·5분 읽기
16진수 헷갈림 — 0xFF·#FFFFFF·CSS·MAC주소 5가지 진법 실전
0xFF·#FFFFFF·MAC 주소·UTF-8·서브넷 마스크에서 헷갈리는 진법 5가지 실전. 16진수·10진수·2진수 변환과 자주 틀리는 함정까지 정리했어요.

🔢
진법 변환기 바로 사용하기
2진수, 8진수, 10진수, 16진수를 변환하세요
→
왜 진법이 자꾸 헷갈릴까요?
코드 보면 `0xFF`, `255`, `0b11111111` 다 보이는데 "이게 같은 값이야?" 갸우뚱한 적 있을 거예요. 셋 다 같은 숫자 — 10진수 255. 표기법만 달라요.
진법 표기 컨벤션.
- **2진수(Binary)**: `0b` 접두사 (Python·JavaScript)
- **8진수(Octal)**: `0o` 또는 `0` (예전 C 스타일)
- **10진수(Decimal)**: 접두사 없음
- **16진수(Hex)**: `0x` 또는 `#` (CSS)
오늘 정리할 5가지.
1. C·Python의 `0xFF` — 비트 마스크
2. CSS `#FFFFFF` — 색상 코드
3. MAC 주소 `00:1A:2B:3C:4D:5E` — 6바이트 16진수
4. UTF-8 `EA B0 80` — 한글 한 글자 3바이트
5. 서브넷 마스크 `255.255.255.0` ↔ `/24` ↔ 2진수
실전 변환 시 [Toolkio 진법 변환기](https://toolkio.com/tools/number-base-converter)에 한 번에 넣고 4가지 진법 동시 확인.
케이스 1) 0xFF — 비트 마스크와 1바이트 최댓값
C, Python, JavaScript 코드에서 `0xFF`는 자주 등장. 의미는 1바이트(8비트)가 모두 1인 값.
변환.
- 16진수: `0xFF`
- 2진수: `0b11111111` (1이 8개)
- 10진수: `255`
자주 쓰이는 곳.
```python
# 하위 8비트 추출 (마스킹)
value = 0x12AB
low_byte = value & 0xFF # 0xAB = 171
# RGB 채널 분리
color = 0xFF8800
red = (color >> 16) & 0xFF # 0xFF = 255
green = (color >> 8) & 0xFF # 0x88 = 136
blue = color & 0xFF # 0x00 = 0
```
실수 포인트.
- `0xFF` 와 `255` 헷갈리지 마세요. 같은 값인데 표기 다름
- C에서 `unsigned char`(0~255) 최댓값 = `0xFF`
- `signed char`(-128~127) 최댓값 = `0x7F` = 127, 최솟값 = `0x80` = -128 (2의 보수)
2의 보수 함정. `0xFF`를 `signed char`로 해석하면 `-1`. 같은 비트 패턴이 데이터 타입 따라 의미 다름. C 캐스팅 시 자주 발생.
케이스 2) CSS #FFFFFF — RGB 16진수
CSS 색상 `#FFFFFF`는 흰색. 6자리 16진수가 RGB 3채널 각 2자리씩.
분해.
- `#FFFFFF` = `#FF` + `#FF` + `#FF`
- 빨강 255 + 초록 255 + 파랑 255
- 10진수 표기: `rgb(255, 255, 255)`
자주 쓰이는 색.
- `#000000` = 검정 (RGB 0,0,0)
- `#FF0000` = 빨강 (RGB 255,0,0)
- `#00FF00` = 순녹색 (RGB 0,255,0)
- `#1E90FF` = 도저블루 (RGB 30,144,255)
3자리 단축 표기.
- `#F00` = `#FF0000` (각 자리 두 번 반복)
- `#FFF` = `#FFFFFF`
- `#1A2` = `#11AA22` (주의: 단순 반복 X, `#11`, `#AA`, `#22`)
8자리 RGBA.
- `#FFFFFFFF` = 마지막 2자리가 알파(투명도)
- `#FFFFFF80` = 50% 투명 흰색
- 알파 80(16진) = 128(10진) = 0.5 (0~255 범위)
OKLCH·HSL은 16진수 아닌 함수형 표기. 최신 CSS는 [HEX vs RGB vs HSL 차이](/blog/hex-rgb-hsl-difference-designer-guide)에서 비교.
케이스 3) MAC 주소 — 6바이트 16진수
네트워크 인터페이스 MAC 주소. 형식 `XX:XX:XX:XX:XX:XX` (콜론) 또는 `XX-XX-XX-XX-XX-XX` (대시) 또는 `XXXXXXXXXXXX` (구분자 없음).
구조.
- 6바이트 = 48비트
- 각 바이트 16진수 2자리 (00~FF)
- 앞 3바이트 = OUI(제조사 식별)
- 뒤 3바이트 = 제조사 내부 시리얼
예시. `00:1A:2B:3C:4D:5E`
- `00:1A:2B` = OUI (이 예시는 실존 OUI)
- `3C:4D:5E` = 시리얼
- 2진수로 펼치면: `00000000 00011010 00101011 00111100 01001101 01011110`
특수 비트.
- 첫 바이트의 LSB(최하위 비트) = 1이면 멀티캐스트, 0이면 유니캐스트
- 첫 바이트의 두 번째 비트 = 1이면 로컬 관리(랜덤 MAC), 0이면 글로벌(제조사 할당)
예시. `02:1A:2B:3C:4D:5E` → 첫 바이트 02 = 0000 0010 → 두 번째 비트 1 → 로컬 관리 (사용자가 변경한 랜덤 MAC, iPhone·Android 프라이버시 기능).
IPv6 EUI-64 변환 시 MAC 주소 가운데에 `FF:FE`를 끼워넣고 7번째 비트를 반전. 이 과정도 16진수↔2진수 변환의 정수.
케이스 4) UTF-8 한글 — 3바이트 16진수
한글 "가" 한 글자를 UTF-8로 인코딩하면 3바이트.
변환 과정.
- 유니코드 코드포인트: U+AC00 (16진)
- 10진: 44032
- 2진: `1010 1100 0000 0000` (16비트)
- UTF-8 인코딩 규칙(U+0800~U+FFFF는 3바이트, 패턴 `1110xxxx 10xxxxxx 10xxxxxx`)
- 16비트 → 4-6-6 분할 → `1010 + 110000 + 000000`
- 3바이트 결과: `11101010 10110000 10000000` = `EA B0 80`
검증.
```python
>>> '가'.encode('utf-8').hex()
'eab080'
```
UTF-8 한글 자주 쓰는 범위.
- 가 ~ 힣 = U+AC00 ~ U+D7A3
- 16진: AC00 ~ D7A3 (총 11,172 글자)
- UTF-8: EA B0 80 ~ ED 9E A3
주의. URL 인코딩에서 "가"는 `%EA%B0%80` (UTF-8 3바이트를 %로 표현). EUC-KR이면 `%B0%A1` (2바이트). 인코딩 다르면 깨짐. 자세한 건 [URL 인코딩 한글 파라미터 깨짐](/blog/url-encoding-korean-parameter-fix-guide)에서.
Base64 변환과도 다름. UTF-8은 바이너리 인코딩, Base64는 그 바이너리를 ASCII로 한 번 더 인코딩.
케이스 5) 서브넷 마스크 — IP, 진법, CIDR
네트워크 서브넷 마스크 `255.255.255.0` ↔ CIDR `/24` ↔ 2진수 변환.
10진수 IPv4 4옥텟.
- `255.255.255.0`
- 각 옥텟 0~255 (1바이트씩)
2진수 변환.
- 255 → `11111111` (8비트 모두 1)
- 0 → `00000000`
- 전체: `11111111.11111111.11111111.00000000`
CIDR 표기.
- 1의 개수 세기: 8 + 8 + 8 + 0 = 24
- `/24` (슬래시 24)
자주 쓰는 변환.
| 마스크 | CIDR | 호스트 수 |
|------|------|---------|
| 255.0.0.0 | /8 | 16,777,214 |
| 255.255.0.0 | /16 | 65,534 |
| 255.255.255.0 | /24 | 254 |
| 255.255.255.128 | /25 | 126 |
| 255.255.255.192 | /26 | 62 |
| 255.255.255.224 | /27 | 30 |
| 255.255.255.240 | /28 | 14 |
| 255.255.255.248 | /29 | 6 |
| 255.255.255.252 | /30 | 2 |
호스트 수 = 2^(32-CIDR) - 2 (네트워크 주소·브로드캐스트 제외).
주의. 마스크는 반드시 1이 연속해야 함. `255.255.255.16`처럼 중간에 0 끼면 잘못된 마스크. 2진수로 펼쳐서 확인 필수. 16진수로는 `0xFF.0xFF.0xFF.0x00`.
실무. 라우팅 테이블·방화벽 룰·DHCP 설정에서 매일 등장. 변환 헷갈리면 [Toolkio 진법 변환기](https://toolkio.com/tools/number-base-converter)에 10진수 입력 → 2진수 자동.
Toolkio 진법 변환기 — 4진법 한 번에
[Toolkio 진법 변환기](https://toolkio.com/tools/number-base-converter)에 숫자 하나 입력하면 2·8·10·16진수 동시 표시. 비트 시각화도 제공해서 마스킹·시프트 디버깅에 유용.
사용 예.
1. `0xFF` 입력 → 255, 0b11111111, 0o377 즉시
2. `255.255.255.0` 한 옥텟씩 변환 → `/24` CIDR 도출
3. UTF-8 디버깅: `0xEAB080` → `15446144` (10진), `1110 1010 1011 0000 1000 0000` (2진)
4. RGB → HEX: `rgb(30,144,255)` → 30=0x1E, 144=0x90, 255=0xFF → `#1E90FF`
5. MAC 주소 OUI 검색 시 `00:1A:2B`만 따로 변환 → 10진수로 OUI 데이터베이스 조회
관련 글로 [HEX vs RGB 색상 변환 원리](/blog/hex-rgb-color-conversion-principle)에서 색상 진법 심화, [URL 인코딩 한글 파라미터](/blog/url-encoding-korean-parameter-fix-guide)에서 UTF-8 인코딩 디버깅을 이어 보세요.
진법 헷갈림은 한 번 정리하면 평생 가요. 5초 변환으로 디버깅 시간 1시간 절약.