-
이진법, 16진법, 비트와바이트, 인코딩공부 2018. 7. 12. 22:43
정말정말 간단한건데 사용안할 줄 알고 대충알고 넘어갔다가 이번에 큰코를 다쳤.............
16진법만 다시 정리할까 했는데 전체적인 내용을 다시 까먹지 않기 위해 비트와 관련된 알고 있는 내용까지 전부 정리합니다.
이진법 (binary)
컴퓨터는 이진법으로 이해를 합니다. 우리가 사용하는 수의 표현방법은 십진법입니다. 이진법에는 0 또는 1 만 존재합니다. 알다시피 십진법은 0~9까지 존재합니다.
십진법 ↔ 이진법
십진법에서 1은 이진법에서도 1입니다. 십진법에서 3은 이진법으로 표현하자면 11이 됩니다. 이를 다시 십진법으로 변경하자면 2^1 + 2^0 = 3 으로 성립이 됩니다. 자리 수가 n개인 이진법를 십진법로 계산하는 공식은 2^n-1 + 2^n-2 + ... + 2^1 + 2^0 이 됩니다. 마지막으로 5를 이진법로 변경하면 101이고 이를 다시 공식에 대입하면 5가되는 것을 알 수 있습니다. 아래 예시 표를보고 공식에 대입해보면 쉽게 이해가 됩니다.
십진법 이진법 0 0 1 1 3 11 5 101 10 1010 시간이 없을 땐 https://ko.calcuworld.com/%EC%88%98%ED%95%99/2%EC%A7%84%EB%B2%95-%EA%B3%84%EC%82%B0%EA%B8%B0/ 를 사용하면 깔끔하게 변환이 됩니다.
비트와 바이트
위에서 이진법을 설명한 이유는 비트 때문입니다.
비트는 0, 1로 이루어져 있습니다. 십진법 5를 표현하려면 자리수가 3개이므로 3비트가 필요합니다. 마찬가지로 10을 표현하려면 4비트가 필요하단 뜻입니다.
위 이진법을 알고 있다면 다음의 비트가 몇개의 수를 표현하고 있는지 읽을 수 있습니다.
0100000101110000 끊어 읽는 규칙이 없으면 위 비트는 많은 방식으로 해석될 수 있습니다. 컴퓨터는 8비트를 데이터의 크기 기본단위로 사용하여 8비트씩 끊어 읽습니다. 8비트인 이유는 초창기 알파벳과 여러 특수문자를 표현하는 데 필요한 최소한의 크기로 채택이 되었기 때문입니다.
이진법 01000001 01110000 십진법 65 122 8비트는 1바이트와 같은 개념입니다.
1바이트는 8비트이며 표현할 수 있는 수는 2^8 = 256가지 입니다.
2바이트는 16비트와 같은개념이고 표현할 수 있는 2^16 입니다.
16진법
십진법 이진법 16진법 0 0000 0000 00 1 0000 0001 01 3 0000 0011 03 5 0000 0101 05 10 0000 1010 0A 15 0000 1111 0F 17 0001 0001 11 위 표처럼 a,b,c,d,e,f 를 합쳐 16가지의 문자를 표현할 수 있습니다. 16진법은 이진법을 보다 쉽게 축약하여 보여줄 수 있습니다.
아래 문자열을 계산하는 예를 확인하면 이진법보단 16진법이 좀 더 보기 간편한 것을 알 수 있습니다.
APPLE 이진법 0100 0001 0111 0000 0111 0000 0110 1100 0100 0101 16진법 4 1 7 0 7 0 6 C 6 5 십진법 65 112 112 108 101 코딩을 하다보면 종종 16진법으로 결과가 내려오는 경우가 있는데 (SHA256 결과) 만약 64자의 길이를 가지고 있다면 이는 32bytes 입니다. 위 표에서 보는 것과 같이 16진법은 2개당 1바이트를 사용합니다.
기타
십진법에서 0.01234 라는 값에서 소수점을 우측으로 옮기고 싶다면 10^n을 곱하면 됩니다. 예) 0.01234 * 10 = 0.1234, 0.01234 * 10^2 = 1.234,
16진법에서 0.001f24 라는 값에서 소수점을 우측으로 옮기고 싶다면 16^n을 곱하면 됩니다. 예) 0.001f24 * 16^ = 0.01f24, 0.001f24 * 16^2 = 0.1f24
위 16진법에서 주의할 점은 0.001f24에서 지수자리인 0은 00이 생략되었다고 보는 것이 나중에 편합니다.
[00].[00][1f][24] 이와같이 2자리씩 끊어 존재한다고 인식하는게 편합니다.
인코딩
인코딩은 간단하게 설명합니다.
ANSI
미국에서 표준을 지정. 코드표를 이야기 할 경우엔 ANSI에서 제정한 ASCII와 동일
ASCII
아스키코드라 읽으며 1바이트로 문자를 표현.
한글은 표현할 수 없음.
EUC-KR
ANSI의 한국확장판. 영문을 포함한 ANSI 코드 부분은 1바이트, 한글 등의 문자는 2바이트. 일부 한글이나 아랍어 등을 표현 못함
유니코드
unicode. 세계에 존재하는 모든 문자를 표현하기 위해 제정된 표준 코드 표. 하나의 문자는 유일하게 하나의 수와 짝지어짐.
유니코드로 저장된 문서는 맨 앞에 (BOM)값이 존재할 수 있음. 이는 문서가 어떠한 엔디안을 사용해서 인코딩 되었는지 알려주기 위함. 혼란이 없는 경우엔 생략되기도 함.
UTF-16
16비트 즉 2바이트씩 끊어서 표현. 희귀한 일부 문자들을 제외한 대부분의 문자는 하나 글자당 2바이트로 표현될 수 있음. 2바이트로 표현되지 않는 문자는 2바이트가 더해져 4바이트로 표현.
UTF-8
8비트 즉 1바이트씩 끊어서 표현. ASCII는 1바이트, 유럽문자는 2바이트, 아시아문자는 3바이트로 표현. 파일의 용량절약과 ASCII와의 호환성 향상 이점이 존재.