[Chapter 1-c] 2진수, 8진수, 16진수란 무엇인가?

cherry·2022년 3월 4일
0

📚 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진수를 표현하기도 한다.

profile
FE developer

0개의 댓글