# 4열로 보는 ASCII 테이블 (2017)

> Clean Markdown view of GeekNews topic #29305. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=29305](https://news.hada.io/topic?id=29305)
- GeekNews Markdown: [https://news.hada.io/topic/29305.md](https://news.hada.io/topic/29305.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2026-05-09T08:22:01+09:00
- Updated: 2026-05-09T08:22:01+09:00
- Original source: [garbagecollected.org](https://garbagecollected.org/2017/01/31/four-column-ascii/)
- Points: 1
- Comments: 0

## Topic Body

- ASCII를 7비트 중 **상위 2비트(그룹)** 와 **하위 5비트(값)** 로 나눠 4열 테이블로 배치하면, 제어 문자와 출력 문자 간의 관계가 즉시 드러남  
- `CTRL` 키는 입력된 문자의 상위 비트를 0으로 만들어, 같은 하위 5비트를 공유하는 **제어 문자(control character)** 를 생성하는 원리  
- 예를 들어 `[`(10 11011)에 CTRL을 누르면 `ESC`(00 11011)가 되는데, 이는 **비트 AND 연산**으로 설명 가능  
- `^J`가 줄바꿈, `^H`가 백스페이스, `^I`가 탭인 이유도 동일한 구조이며, Windows 텍스트 파일의 **`^M`(CR)** 표시도 같은 원리  
- 통상적인 ASCII 테이블은 이 패턴을 숨기지만, **32개씩 열을 나누면** 설계 의도가 명확히 드러남  
  
---  
  
### 4열 ASCII 테이블의 발견  
- Hacker News 사용자 soneil이 [ASCII 테이블을 **32개 단위로 4열 배치한 버전**](https://pastebin.com/cdaga5i1) 을 게시  
- 이 배치를 통해 대소문자 전환이 **단일 비트 차이**라는 점, 알파벳이 `40h + 순서값`(소문자는 `60h`)이라는 점이 즉각적으로 파악 가능  
- `^\[`가 왜 ESC인지도 이 테이블에서 바로 확인 가능  
  
### ASCII 7비트 인코딩 구조  
- ASCII는 **7비트 인코딩**이며, 앞 2비트는 4개 그룹을 나타내고 뒤 5비트는 32개 값을 표현  
  - 그룹 `00`: 제어 문자 (NUL, SOH, STX, ESC 등)  
  - 그룹 `01`: 특수 문자 및 숫자 (Spc, !, ", # 등)  
  - 그룹 `10`: 대문자 알파벳 (@, A, B, C 등)  
  - 그룹 `11`: 소문자 알파벳 (`, a, b, c 등)  
- 같은 행에 있는 문자들은 **하위 5비트가 동일**하고, 그룹 비트만 다름  
  
### 4열 ASCII 테이블  
  
| 비트 | 00 (제어) | 01 (특수/숫자) | 10 (대문자) | 11 (소문자) |  
|-------|-----------|----------------|-------------|-------------|  
| 00000 | NUL | Spc | @ | ` |  
| 00001 | SOH | ! | A | a |  
| 00010 | STX | " | B | b |  
| 00011 | ETX | # | C | c |  
| 00100 | EOT | $ | D | d |  
| 00101 | ENQ | % | E | e |  
| 00110 | ACK | & | F | f |  
| 00111 | BEL | ' | G | g |  
| 01000 | BS | ( | H | h |  
| 01001 | TAB | ) | I | i |  
| 01010 | LF | * | J | j |  
| 01011 | VT | + | K | k |  
| 01100 | FF | , | L | l |  
| 01101 | CR | - | M | m |  
| 01110 | SO | . | N | n |  
| 01111 | SI | / | O | o |  
| 10000 | DLE | 0 | P | p |  
| 10001 | DC1 | 1 | Q | q |  
| 10010 | DC2 | 2 | R | r |  
| 10011 | DC3 | 3 | S | s |  
| 10100 | DC4 | 4 | T | t |  
| 10101 | NAK | 5 | U | u |  
| 10110 | SYN | 6 | V | v |  
| 10111 | ETB | 7 | W | w |  
| 11000 | CAN | 8 | X | x |  
| 11001 | EM | 9 | Y | y |  
| 11010 | SUB | : | Z | z |  
| **11011** | **ESC** | ; | **[** | { |  
| 11100 | FS | < | \ | \| |  
| 11101 | GS | = | ] | } |  
| 11110 | RS | > | ^ | ~ |  
| 11111 | US | ? | _ | DEL |  
  
### CTRL 키의 동작 원리  
- `CTRL` 키를 누르면 입력 문자의 **상위 비트가 모두 0으로 설정**되어 제어 문자 그룹(00)으로 이동  
- 이는 **비트 AND 연산**으로 표현 가능:  
  - `10 11011`(`[`) AND `00 11111`(CTRL) = `00 11011`(ESC)  
- 따라서 `CTRL+[`이 ESC를 생성하는 것은 임의 배정이 아니라 **비트 연산에 기반한 설계**  
  
### 실용적 예시  
- `^J`(CTRL+J)는 **LF(줄바꿈)**, `^H`(CTRL+H)는 **BS(백스페이스)**, `^I`(CTRL+I)는 **TAB**  
- Windows 텍스트 파일을 `cat -A`로 확인하면 `^M`이 표시되는데, 이는 Windows 줄바꿈이 **CR+LF** 방식이기 때문  
- vim 사용자들이 터미널에서 `CTRL+[`을 ESC 대신 사용하는 것도 이 **비트 구조에서 비롯된 것**

## Comments



_No public comments on this page._
