- 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 대신 사용하는 것도 이 비트 구조에서 비롯된 것