📚 2진수, 8진수, 16진수
2진수를 다루다 보면 눈이 아파오고 읽기가 어려워진다.
2진수를 더 읽기 쉽게 표현하는 방법에 대해 알아보자.
📖 8진 표현법(octal representation)
'8진'이라는 말은 밑이 8이라는 뜻이다. 8진 표현법은 2진수 비트들을 3개씩 묶는 표현법이다.
3비트는 2^3 또는 0 ~ 7까지 값으로 표현할 수 있다.
2진수를 3비트씩 끊어서 8진 표현법으로 바꿔보자.
100101110001010100
100 101 110 001 010 100
4 5 6 1 2 4
비트를 3개씩 묶고, 하나당 8진 숫자를 부여해 456124를 얻었다. 이 값은 2진수에 비해 쉽게 읽히지 않는가?
100이라는 2진 값을 8진 숫자로 바꾸기 위해서는 (1x2^2) + (0x2^1) + (0x2^0) = 4라는 식으로 계산한다.
📖 16진 표현법(hexadecimal representation)
16진은 밑이 16이라는 뜻이다. 8진 표현법 보다 16진 표현법이 더 널리 쓰이고 있다. 그 이유는 요즘은 컴퓨터 내부가 8비트의 배수를 사용해 만들어지기 때문이다.
8의 배수는 4(16진수의 한 자리의 비트 수)로는 균일하게 나눠지지만 3(8진수 한 자리의 비트 수)으로는 균일하게 나눠지지 않는다.
16진수 숫자 하나를 표현하려면 10가지 숫자만으로는 표현하지 못한다. 10을 표현할 숫자부터 15까지 6가지 숫자가 더 필요하다. 그래서 abcdef(또는 ABCDEF)라는 기호가 10부터 15까지의 숫자를 표현한다.
📖 2진수와 16진수
16진수 한 자리는 16가지의 수(2^4) 표현이 가능하다. 이는 2진수에서 네 자리와 같다(4bit 니블은 16진수 한 자리).
따라서 니블(4bit)단위로 읽으면 2진수에서 16진수로 변환을 쉽게 할 수 잇다.
2진수를 4bit씩 끊어서 변환하면 쉽게 16진수로 바꿀 수 있다. 한번 해보자.
0111 1010 0001 0011
7 a 1 3
7a13가 되고 프로그래밍 언어의 진법 표기법에 따르면 0x7a13이 됩니다.
[🔎 2진수와 16진수 변환표 ]
2진수 |
16진수 |
2진수 |
16진수 |
0000 |
0 |
1000 |
8 |
0001 |
1 |
1001 |
9 |
0010 |
2 |
1010 |
a |
0011 |
3 |
1011 |
b |
0100 |
4 |
1100 |
c |
0101 |
5 |
1101 |
d |
0110 |
6 |
1110 |
e |
0111 |
7 |
1111 |
f |
📖 프로그래밍 언어의 진법 표기법
숫자를 보았을 때 어떤 표현법인지 어떻게 알 수 있을까?
예를 들어, 10이 2진수면 10진수 2이고, 8진수면 10진수 8, 16진수면 10진수 16이다.
일관성있는 표기법으로 표현하면 편할 것이다. 여러 프로그래밍 언어에서는 다음과 같은 표기법을 따른다.
- 0으로 시작하는 숫자는 8진수이다(ex. 017)
- 1부터 9사이의 숫자로 시작하는 숫자는 10진수이다(ex. 123)
- 0x가 앞에 붙은 숫자는 16진수다.(0x12f)
0은 8진수인지 10진수인지 구분할 수 없지만, 0은 8진수에서도 0이고 10진수에서도 0을 의미하기 때문에 이 문제는 중요하지 않다.
2진수는 문맥을 보고 2진수인지 알아내기는 쉽지 않고 2진수를 사용할 일도 별로 없기 때문에 2진수 표현을 제공하는 프로그래밍 언어는 거의 없다. C++같은 몇몇 언어는 0b라는 접두사를 사용해 2진수를 표현하기도 한다.