bitGateLab Digital · 배우기
한국어
시뮬레이터 열기

배우기 › 주제 6

수 체계: 2진수, 8진수, 16진수와 코드

읽는 시간 7분 · bitGateLab 팀

디지털 회로는 0과 1만 이해하지만, 여러분은 수량, 부호, 디스플레이의 숫자, 인코더의 위치를 표현해야 합니다. 여기서는 위치 기수법이 어떻게 동작하는지, 10진수·2진수·8진수·16진수 사이를 어떻게 변환하는지, 2의 보수로 음수를 어떻게 나타내는지, 그리고 전자 회로에서 아주 흔히 쓰는 두 가지 코드인 BCD와 그레이 코드를 어떻게 사용하는지 배웁니다.

위치 기수법

기수가 b인 위치 기수법에서 각 자릿수는 오른쪽에서 0부터 세는 자리 위치에 따라 b의 거듭제곱과 곱해집니다. 10진수 347은 3·102 + 4·101 + 7·100입니다. 다른 기수에서도 마찬가지입니다.

혼동을 피하기 위해 기수를 아래 첨자(10102, 178, 3F16)나 0b, 0x 같은 접두사로 표시합니다.

진법 변환

임의의 진법에서 10진수로

각 자릿수에 그 자리의 가중치를 곱해 더합니다. 예를 들어 2F316 = 2·256 + 15·16 + 3·1 = 512 + 240 + 3 = 755입니다.

10진수에서 2진수로

2로 반복해서 나누며 나머지를 적습니다. 2진수는 아래에서 위로 읽습니다(마지막 나머지가 최상위 비트입니다). 다른 방법은 들어갈 수 있는 가장 큰 2의 거듭제곱을 거듭해서 빼는 것입니다.

2진수, 8진수, 16진수 사이

8 = 23이고 16 = 24이므로 10진수를 거칠 필요가 없습니다. 오른쪽부터 비트를 3개씩(8진수) 또는 4개씩(16진수) 묶고, 필요하면 왼쪽에 0을 채웁니다.

예제 1: 156을 2진수, 8진수, 16진수로 변환하기.

  1. 연속 나눗셈: 156/2 = 78 나머지 0; 78/2 = 39 나머지 0; 39/2 = 19 나머지 1; 19/2 = 9 나머지 1; 9/2 = 4 나머지 1; 4/2 = 2 나머지 0; 2/2 = 1 나머지 0; 1/2 = 0 나머지 1.
  2. 나머지를 아래에서 위로 읽으면 156 = 100111002입니다. 검산: 128 + 16 + 8 + 4 = 156.
  3. 8진수: 10 011 100 → 010 011 100 → 2 3 4. 결과 2348 (2·64 + 3·8 + 4 = 156).
  4. 16진수: 1001 1100 → 9 C. 결과 9C16 (9·16 + 12 = 156).

음수: 2의 보수

비트 수가 n인 레지스터에는 "마이너스" 부호를 둘 자리가 없으므로 약속을 정해 씁니다. 거의 모든 프로세서가 쓰는 방식이 2의 보수입니다. 최상위 비트는 음의 가중치 −2n−1을 가지고, 나머지 비트는 양의 가중치를 그대로 유지합니다. 8비트이면 범위는 −128부터 +127까지이고, 4비트이면 −8부터 +7까지입니다.

어떤 수의 음수를 구하려면:

  1. 양수를 모든 비트를 갖춰 적습니다.
  2. 각 비트를 반전합니다(이것이 1의 보수입니다).
  3. 1을 더합니다.

이점은 매우 큽니다. 부호를 위한 특별한 논리 없이 같은 가산기 회로로 덧셈과 뺄셈을 모두 할 수 있습니다. 0은 하나뿐이고(00000000), 최상위 비트가 그 수가 음수인지 바로 알려 줍니다.

예제 2: −45를 8비트로 나타내고 25 + (−12) 계산하기.

  1. 45 = 00101101. 반전하면 11010010. 1을 더하면 11010011 = −45.
  2. 가중치로 검산: −128 + 64 + 16 + 2 + 1 = −45.
  3. 이제 25 + (−12)입니다. 25 = 00011001; 12 = 00001100, 반전하면 11110011, 1을 더하면 11110100 = −12.
  4. 덧셈: 00011001 + 11110100 = 1 00001101. 비트 8에서 넘쳐 나오는 캐리(자리올림)는 버립니다.
  5. 결과: 00001101 = 13. 맞습니다.
오버플로: 부호가 같은 두 수를 더했는데 결과의 부호가 반대라면, 결과가 주어진 비트 수에 들어가지 않는 것입니다. 예를 들어 8비트에서 100 + 50 = 01100100 + 00110010 = 10010110인데, 이는 2의 보수로 150이 아니라 −106입니다. 부호가 다른 수끼리 더하면 오버플로가 일어나지 않습니다.

BCD 코드

BCD(2진화 10진수, 8421 방식)에서는 10진수의 각 자리를 따로따로 4비트로 나타냅니다. 그래서 395는 0011 1001 0101로 씁니다. 395를 2진수로 변환한 것(1100010112)과는 다릅니다. BCD는 비트를 더 많이 쓰지만, 각 묶음을 나눗셈 없이 곧바로 7세그먼트 디스플레이 디코더에 보낼 수 있습니다. 1010부터 1111까지의 코드는 BCD에서 유효하지 않으며, 설계할 때 이 조합들은 보통 카르노 맵에서 무관 조건으로 다룹니다.

그레이 코드

그레이 코드에서는 한 값에서 다음 값으로 넘어갈 때 비트 하나만 바뀝니다. 일반 2진수에서는 7(0111)에서 8(1000)로 넘어갈 때 네 비트가 한꺼번에 바뀝니다. 센서가 바로 그 전환 순간에 값을 읽으면 잠깐 동안 어떤 중간값이든 보게 될 수 있습니다. 그레이 코드에서는 이런 오류가 생기지 않으므로 위치 인코더, 서로 다른 클럭 사이를 넘나드는 카운터, 카르노 맵의 머리글에 쓰입니다.

10진수2진수그레이10진수2진수그레이
000000000810001100
100010001910011101
2001000111010101111
3001100101110111110
4010001101211001010
5010101111311011011
6011001011411101001
7011101001511111000

예제 3: 2진수 1011을 그레이 코드로, 그리고 다시 2진수로.

  1. 첫 비트를 복사합니다: 1.
  2. 1 ⊕ 0 = 1; 0 ⊕ 1 = 1; 1 ⊕ 1 = 0. 그레이 = 1110.
  3. 되돌리기: 첫 비트를 복사합니다, b3 = 1. 이어서 b2 = 1 ⊕ 1 = 0, b1 = 0 ⊕ 1 = 1, b0 = 1 ⊕ 0 = 1. 2진수 = 1011.

표에서 10진수 11은 그레이 코드 1110으로 나와 있습니다. 일치합니다.

흔한 실수

시뮬레이터에서 해 보기

입력과 출력 몇 개만 있으면 이런 표현을 "실시간으로" 볼 수 있고, XOR 게이트로 그레이 코드 변환을 확인할 수 있습니다.

  1. 입력 네 개를 비트 b3부터 b0까지로 놓고, 값을 볼 수 있도록 디스플레이나 LED 네 개를 연결합니다.
  2. XOR 게이트 세 개를 추가합니다: g2 = b3 ⊕ b2, g1 = b2 ⊕ b1, g0 = b1 ⊕ b0. 그리고 b3을 g3에 직접 연결합니다.
  3. 입력을 0000부터 1111까지 바꿔 가며, 한 값에서 다음 값으로 넘어갈 때 출력의 그레이 비트가 하나만 바뀌는 것을 관찰합니다.
  4. 회로의 진리표를 생성해 이 글의 표와 비교합니다.

연습문제

  1. 110101102를 16진수와 10진수로 변환하세요.
    정답

    1101 0110 = D616 = 13·16 + 6 = 214.

  2. 200을 2진수와 16진수로 변환하세요.
    정답

    200 = 128 + 64 + 8 = 110010002 = C816.

  3. −100을 8비트 2의 보수로 나타내세요.
    정답

    100 = 01100100; 반전하면 10011011; 1을 더하면 10011100. 검산: −128 + 16 + 8 + 4 = −100.

  4. 10진수 6을 4비트 그레이 코드로, BCD 0111 0010을 10진수로 변환하세요.
    정답

    6 = 0110; 그레이: 0, 0 ⊕ 1 = 1, 1 ⊕ 1 = 0, 1 ⊕ 0 = 1 → 0101. BCD 0111 0010은 72입니다.

회로가 이런 수를 어떻게 더하고 빼는지 보려면 2진 가산기로 이어 가세요.