진수변환 알고리즘 수동으로 재현하기

진수변환… 보통 프로그래밍 언어에는 해주는 tool이 다 있다. (실화) 일단 가장 간단한 2진수를 예시로 두자면, 13을 이진수로 변환하기 위해

  1. 13/2=6…1
  2. 6/2=3…0
  3. 3/2=1…1

이렇게 계산하게 되고, 이 때 맨 아랫줄의 몫부터 시작해 나머지 싹 긁어서 1101(2)가 된다. (1의 보수까지 가고 싶으면 0을 1로, 1을 0으로 바꾸자. 2의 보수는 1의 보수+1)

다른 예시로 25를 16진수로 바꾸게 되면

  1. 25/16=1…9

이래서 19(hex)가 된다.


이진수로 변환하기 위한 절차는

  1. 어떤 수를 2로 나눌 수 없을 때(1이나 0이 나올때)까지 계속 나눈다. 이 때, 홀수는 나머지가 1, 짝수는 나머지가 0이다.
  2. 2로 나눌 수 없게 되었을 때, 마지막 계산의 몫부터 시작해서 가장 첫 계산의 나머지까지 순차적으로 기록한다.

이것이다. 기재 순서가 가장 마지막(2로 나눌 수 없을 때) 몫-마지막 나머지-…-첫 나머지까지 순차적으로 가기때문에 그 순서에 대해 주의해야 한다.

그리고 이진수를 도출했다는 전제 하에 1의 보수와 2의 보수는(예시는 위에서 변환한 13(1101)으로 든다)

  1. 1101의 1을 0으로, 0을 1로 바꾼다. ->0010
  2. 1에서 도출된 1의 보수에 1을 더한다. ->0011

이렇게 구할 수 있다. 1111의 1의 보수는 0000, 2의 보수는 0001.


2, 8, 16진수는 상호변환도 가능하다. 각각 세자리, 네자리로 끊어서 10진수로 변환하면 되는데… 1101010을 예시로 들어보자.

  1. 1101010을 8진수로 변환하기 위해서는 세 자리로 끊는다. ->001 101 010
  2. 세 자리로 끊은 이진수를 각각 10진수로 변환한다. -> 1 5 2
  3. 8진수 152가 된다.

자릿수보다 모자라면 앞에 0이 그만큼 있다고 생각하면 된다.

  1. 1101010을 16진수로 변환하기 위해서는 네 자리로 끊는다. ->0110 1010
  2. 네 자리로 끊은 이진수를 각각 10진수로 변환한다. 이 때, 10진수로 10, 11, 12, 13, 14, 15가 될 경우 해당하는 알파벳으로 변환한다. (A~F)->6 A
  3. 16진수 6A가 된다.

참 쉽죠? 근데 8진수는 몰라도 16진수는 hex() 없으면 빡실 듯… 조건문 멕여 조건문