ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 이진법, 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가되는 것을 알 수 있습니다. 아래 예시 표를보고 공식에 대입해보면 쉽게 이해가 됩니다.

    십진법이진법
    00
    11
    311
    5101
    101010


    시간이 없을 땐 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비트인 이유는 초창기 알파벳과 여러 특수문자를 표현하는 데 필요한 최소한의 크기로 채택이 되었기 때문입니다.

    이진법0100000101110000
    십진법65122


    8비트는 1바이트와 같은 개념입니다. 

    1바이트는 8비트이며 표현할 수 있는 수는 2^8 = 256가지 입니다.

    2바이트는 16비트와 같은개념이고 표현할 수 있는 2^16 입니다.

    16진법

    십진법이진법16진법
    00000 000000
    10000 000101
    30000 001103
    50000 010105
    100000 10100A
    150000 11110F
    170001 000111


    위 표처럼 a,b,c,d,e,f 를 합쳐 16가지의 문자를 표현할 수 있습니다. 16진법은 이진법을 보다 쉽게 축약하여 보여줄 수 있습니다.

    아래 문자열을 계산하는 예를 확인하면 이진법보단 16진법이 좀 더 보기 간편한 것을 알 수 있습니다.

    APPLE
    이진법01000001
    01110000
    01110000
    01101100
    01000101
    16진법41
    70
    70
    6C
    65
    십진법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와의 호환성 향상 이점이 존재.

    댓글