오늘은 프로그래밍에 있어서 중요한 기본이라고 할 수 있는,

bit, byte 그리고 16진수와 ASCII 코드에 대해서 정리해 보도록 하겠습니다.

 

 

1. Bit

Bit는 Binary Digit의 약자입니다.

컴퓨터에서 사용하는 가장 작은 단위의 데이터이기도 하구요.

 

Binary라는 것이 2개를 의미하며, digit은 자리를 의미하는데요.

즉, 2개의 자리수라는 뜻입니다.

그리고 그 2개의 수는 0과 1입니다.

 

10진수를 이용하여 수를 이해하는 것이 익숙하고 편한 인간에 비해서,

on/off로 data를 이해하는 컴퓨터는 0과1로 모든 데이터를 표현합니다.

100은 1100100이라고 컴퓨터는 이해합니다.

 

Nbit라고 하면 N개의 0과 1을 이용하여 데이터를 표현할 수 있는 수를 의미합니다.

 

비트수 표현 가능한 수 10진수로 변환가능한 수
1bit 0, 1 0과 1
2bit 00, 01, 10, 11
(2의 2승만큼의 개수)
0부터 3까지
4bit 0000 0001 0010 0011
0100 0101 0110 0111
1000 1001 1010 1011
1100 1101 1110 1111 
(총 2의 4승 만큼의 개수)
0부터 15까지
8bit 00000001  00000010 
00000011 00000100 
....
(중략)
....
11111100 11111101
11111110 11111111

(총 2의 8승 만큼의 개수 = 256개의 수 표현)
0부터 255까지

 

 

2. 8bit 와 Byte

Byte는 8개의 bit를 가진 8bit를 가르킵니다. Octet이라고도 하는데요.

8bit이므로 256개의 값을 가질 수 있습니다.

이 Byte은 정보교환의 기본단위로 사용되어 집니다.

 

컴퓨터에서는 알파벳을 기준으로 1개의 문자를 처리하는데 있어서 8bit, 즉 1byte를 사용하고 있구요.

저장장치등 정보교환 장치등에서 이 Byte를 기본단위로 사용하게 되는데요.

Byte, Kilobyte, Megabyte, Gigabyte등은 다음과 같은 단위로 사용됩니다.

 

Bytes단위 용량
Byte 8bit
Kilobyte 1,000 Bytes
Megabyte 1백만 Bytes
Gigabyte 10억 Bytes

 

컴퓨터가 저장하는 문자의 최소단위가 byte인 것 이지요.

그래서, 공식문서 같은 곳에서 12byte자리수의 Random한 수를 생성한다고 하면,

92bit의 자리수를 저장한다는 것을 알 수 있겠지요.

 

3. 4bit와 16진수(Hexadecimal)

위의 표에서도 본 4bit를 Nibble(Nybble 또는 Nyble이라고도 함)이라고도 합니다.

8bit의 절반이므로, Half-Byte나, semi-Octet이라고도 합니다.

 

4bit는 0부터 15까지의 숫자를 표현할 수 있는데요.

문제는 10진수로 이것들을 어떻게 대응시킬 것인가인데요.

 

0~9까지는 10진수의 한자리수와 대응이 되지만,

나머지 10~15까지 한자리수로는 10진수와 대응하기가 어렵게 됩니다.

2자리수가 되면, 연속적으로 붙였을때, 어디가 어디까지인지 알기 힘들게 되겠지요.

 

그래서 다음과 같이 알파벳을 대응시키기로 하였습니다.

이렇게 한자리수로 표현할 수 있는, 16진수가 나오게 된 것 입니다.

16진수를 영어로 Hexadecimal이라고 하구요.

약어로 Hex라고 표현합니다.

 

10 11 12 13 14 15
a b c d e f

 

 

16진수라는 것을 알려주기 위해서,

0x라는 것을 앞에 붙이고 있는데요.

0xFF라고 하면, ff는 11111111을 의미하게 되는 것 이지요.

 

4bit를 2개 붙이면, 8bit를 표현할 수 있게 됩니다.

이렇게 되면, 붙여서 쓰더라도, 각 2개씩이 8bit로 표현할 수 있게 됩니다.

붙여쓰더라도, 8bit씩구분해서 이해할 수 있게되는 것 이지요.

 

 

3. 10진수와 16진수

위에서 4bit와 16진수에 대해서 알아보았는데요.

 

3-1. 16진수의 장점

16진수로 표현한 1자리는 무조건 Nibble(4bit)이므로, 

2개를 붙이면 1byte가 됩니다.

컴퓨터의 데이터 기본단위이며, 문자단위의 기본인 1byte의 범위를 쉽게 구분할 수 있게 됩니다.

 

이에 반해, 10진수는 수자체는 구분하기가 쉽지만, 

붙어있을때 어디까지가 1byte인지 구분하기가 어렵습니다.

 

4. ASCII Code와 8bit

ASCII Code는 정보교환을 위한 미국의 표준 코드인데요.

ASCII 코드자체는 7bit를 사용하지만, 통신에러 등의 컨트롤을 위해 1bit를 사용합니다.

7bit의 128개의 문자에 10진수를 대응해 놓고, 그것을 8bit로 변환해 표현할 수 있는데요.

예를 들어, "helo"는 각각 다음과 같이 할당되어 있습니다.

 

Char 10진수 16진수(Hex)
h 106 6A
e 107 6B
l 108 6C
o 111 6F

 

이제 "hello"를 붙여서 표현해 보겠습니다.

10진수로는 "106107108108111" 인데요.

16진수로 해보면 "6A6B6C6C6F" 입니다.

10진수의 경우, 대응되는 첫글자를 찾는데에도,

어디까지가 끝인지 알수가 없습니다.

10에 해당하는 글자가 먼저인지, 106에 해당하는 문자인지말이지요.

(물론 실제로는 맞춰보다 보면 인간은 이해할 수 있겠지만요)

 

 

반면, 16진수로는 2개씩이 1byte이므로 빠르게 대응하는 글자를 찾아낼 수 있습니다.

왜 16진수를 써야하는지 잘 알 수 있는 부분입니다.

 

5. UTF-8

한글이나 여러 세계의 언어들은 조합해야되는 문자의 수가 매우 많습니다.

ASCII코드와 같은 128개의 조합으로는 이들을 표현할 수 가 없는 것 이지요.

이를 해결하기 위해서, 더 많은 byte로 구성된 Unicode가 제정되게 되었습니다.

이에 대응되는 여러 스펙들이 생겨났는데요.

UTF-8, 16, 32 등이 있습니다.


이 중 현재도 널리 사용되는 것이 UTF-8인데요.

128까지는 ASCII코드와 같아서, 1byte로 표시가 가능하구요.

나머지 문자들은, 2,3,4 byte까지가 있는데요.

시작하는 문자열을 정해서, 구분해서 읽도록 규칙을 만들어 주었습니다.

예를 들면, 1byte의 문자는 앞을 0으로 시작하도록 하는 규칙이 그렇습니다.

 

6. 정리

프로그래밍을 이해하면서 자주 만나게 되는, bit 와 byte 라는 개념,

그리고 16진수(Hexadecimla)등에 대해서 이해해 보았습니다.

마지막으로 간단히 알아본 UTF-8은 아누래도 복잡도가 높은데요.

정리했던 개념들을 바탕으로 필요하실 때,

구체적인 스펙을 보면 이해를 하시는데 많은 도움이 될 것 같습니다.

 

bit와 관련되 수는 아래 사이트를 참조해 보시면 쉽게 대응되는 Decimal(10진수)를 보실 수 있습니다.

>> https://www.binary-code.org

 

728x90

+ Recent posts