1P by GN⁺ 2시간전 | ★ favorite | 댓글과 토론
  • 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열 배치한 버전 을 게시
  • 이 배치를 통해 대소문자 전환이 단일 비트 차이라는 점, 알파벳이 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 대신 사용하는 것도 이 비트 구조에서 비롯된 것