[python] 16진법 사용 이유



 

16진법이란

16진법은 10개의 숫자(0~9)와 6개의 문자 (A~F)를 사용해서 값을 표현합니다.
문자는 A(10), B(11), C(12), D(13), E(14), F(15)이며 아래 표를 참고하세요.
위 그림에서 2진법은 15라는 숫자를 4자리로 표현하는 반면 16진수는 1자리로 표현할 수 있습니다. (2의 4승을 표현할 수 있기 때문)
16진법은 4개의 비트 값을 "한번"에 표현할 수 있다는 점을 확인해주세요.

16진법을 사용하는 이유

바이트가 커질 때 2, 10, 16진법 범위를 보게되면 아래와 같습니다.
2진법은 바이트가 늘어남에 따라 자릿수가 기하급수적으로 늘어나는 단점이 존재하며, 사람은 10진수에 익숙하기 때문에 2진수로 적힌 값이 10진수로 얼마인지 직관적으로 파악하기 어렵습니다.

0b1111101000은 10진수로 얼마인가? -> 1000

반대로 10진법은 바이트마다 떨어지는 단위가 깔끔하지 않습니다.(255, 65535, 4294967295...) 또한 1000이라는 수는 2 바이트로 저장되는데, 만약 바이트 단위로 나눠 10진수로 표현할 때 문제가 발생합니다. (10진수는 바이트 단위로 나눠 떨어지는 값이 아니여서)

물론 각 바이트에 저장된 1000을 표현하기 위해 256(1바이트 범위)으로 나눠 몫과 나머지로 표현할 수 있습니다. (256 * 3 + 244 = 1000)
다만, 2바이트를 몫과 나머지로 표현한 그림을 보고 1000이라는 것을 직관적으로 이해할 사람은 거의 없을 겁니다.

마지막으로 16진법은 1바이트(8비트)마다 FF 단위로 증가하고 자릿수 또한 다른 진법보다 적게 사용합니다. 
1000을 2진수로 표현할 때 사람이 직관적으로 변환 할 수 없고 계산을 통해 0b1111101000임을 알 수 있습니다.

하지만 16진법은 0x3e8(1000)로 훨씬 짧게 표현할 수 있으며, 16진법은 자릿수가 4비트를 의미하기 때문에 아래와 같이 직관적인 2진법 변환 및 해당 값(1000, 0x3e8)이 2 바이트 크기를 갖는 걸 바로 파악할 수 있습니다. (16진수 자릿수는 4비트고, 1바이트는 8비트이기 때문에)

물론 컴퓨터 내부는 2진법을 사용하고 사람이 프로그래밍을 하는 과정에서 16진법이 용이하다는 의미입니다.

결론

16진수 하나가 2의 4승을 표현할 수 있기 때문에 2진법으로 15를 0b1111로 표현할 수 있지만, 16진법은 0xF로 훨씬 짧게 표현할 수 있습니다.
또한 데이터를 저장하기 위해 몇 바이트가 필요한지 또는 사람이 2진법으로 변환할 때 별다른 계산없이 값을 직관적으로 구할 수 있습니다.

즉, 16진법은 사람과 기계 사이의 해석을 용이하게 하기 위해 사용하는 방법입니다. (사람 <-> 16진법 <-> 기계)

댓글

이 블로그의 인기 게시물

[opencv-python] 이미지 크기조절(resize) 하는 법

[python]파이썬: csv reader header skip (첫번째 행 무시하기, 안읽기)

[python] selenium close와 quit 차이점