Java 진법 3

2021. 5. 27. 18:00Java

n진수를 10진수로 변환

어떤 진법의 수라도 10진수로 변환하는 방법은 똑같다. 각 자리의 수에 해당 단위의 값을 곱해서 모두 더하면 된다. 예를 들어 10진수 123은 다음과 같이 풀어쓸 수 있다.

123 = 100 + 20 + 3

     = 1 X 100 + 2 X 10 + 3 X 1

     = 1 X 10의2승 + 2 X 10의1승 + 3 X 10

마찬가지로 2진수는 다음과 같이 표현할 수 있는데, 각 자리의 다위가 10의 제곱이 아니라 2의 제곱이라는 점을 제외하면 10진수와 동일하다.

8진수와 16진수로 변환하는 방법 역시 동일하다.

1460(8) = 1 x 8의3승 + 4 x 8의2승 + 6 x 8의 1승 + 0 x 8의 0승

          = 1 x 512 + 4 x 256 + 6 x 8 + 0 x 1 = 512 + 256 + 48 + 0 = 816(10)

64F(16) = 6 x 16의2승 + 4 x 16의1승 + F(15) x 16의0승

          = 6 x 256 + 4 x 16 + F(15) x 1 ← F는 10진수로 15이므로 15 x 1과 같다. = 1536 + 64 + 15

          = 1615


실수의 진법변환

10진 소수점수를 2진 소수점수로 변환하는 방법

앞서 10진 정수를 2진 정수로 변환할 때, 10진수를 2로 계속 나누면서 나머지를 구했던것을 기억할 것이다. 10진 소수점수를 2진 소수점수로 변환하는 방법은 이와 반대로 10진 소수점수에 2를 계속 곱한다.

  1. 10진 소수에 2를 곱한다.
  2. 0.625 x 2 = 1.25
  3. 위의 결과에서 소수부만 가져다가 다시 2를 곱한다.
  4. 0.25 x 2 = 0.5
  5. 1과 2의 과정을 소수부가 0이 될 때 까지 반복한다.
  6. 0.5 x 2 = 1.0
3의 과정에서 소수가 0이 되지않고 무한히 반복될 수도 있다.

 

위의 결과에서 정수부만을 위에서 아래로 순서대로 적고 '0.'을 앞에 붙이면 된다.

0.625 x 2 = 1.25

0.25 x 2 = 0.5

0.5 x 2 = 1.0 위에서 아래로 1 0 1 아래에서 위로 X

0.625(10) → 0.101(2)

참고로 10진 소수를 10진 소수로 변환하는 방법은 다음과 같다. 2대신 10을 곱할 뿐이다. 10진 소수를 2진 소수로 변환하는 방법을 기억하는데 도움이 될 것이다.

0.625 x 10 = 6.25

0.25 x 10 = 2.5

0.5 x 10 = 5.0 위에서 아래로 625 아래에서 위로 X

0.625(10) → 0.625(10)

 

2진 소수점수를 10진 소수점수로 변환하는 방법

그러면, 이제 2진 소수를 10진소수로 바꿔서 0.101(2)가 정말로 0.625(10)인지 확인해보자.

0.625(10)를 다음과 같이 표현할 수 있듯이

0.625(10) = 6 x 10의-1승 + 2 x 10의-2승 + 5 x 10의-3승

            = 6 x 0.1 + 2 x 0.01 + 5 x 0.001 = 0.6 + 0.02 + 0.005 → 0.625

0.101(2)은 다음과 같이 표현할 수 있다.

0.101(2) = 1 x 2의-1승 + 0 x 2의-2승 + 1 x 2의-3승

          = 1 x 0.5 + 0 x 0.25 + 1 x 0.125 = 0.5 + 0 + 0.125 → 0.625

123.456처럼 정수부가 있는 소수점수는 정수부 123과 소수점부 0.456을 따로 변환한 다음에 더하면 된다.

음수의 2진 표현 - 2의 보수법

보수(補數)는 각 자리의 숫자의 합이 어느 일정한 수가 되게 하는 수이다. - 위키백과

 

앞서 살펴본 것과 같이 n비트의 2진수로 표현할 수 있는 값의 개수는 모두 2의n승이므로, 4비트의 2진수로는 모두 2의4승(=16)개의 값을 표현할 수 있다. 이 값을 모두 '부호없는 정수(0과 양수)'의 표현에 사용하면, 아래와 같이 0부터15까지의 정수를 나타낼 수 있다.

그러면 4비트의 2진수로 부호있는 정수, 즉 양수와 음수를 모두 표현하려면 어떻게 해야 할까? 4비트 2진수의 절반인 8개는 0으로 시작하고, 나머지 절반은 1로 시작하니까. 1로 시작하는 2진수를 음수표현에 사용하자. 이렇게 하면, 왼쪽의 첫 번쨰 비트(MSB)가 0이면 양수, 1이면 음수이므로 첫 번째 비트만으로 값의 부호를 알 수 있게 된다.

MSB란 2진수의 제일 왼쪽의 1bit를 MSB(Most Significant Bit)라고 한다. 1(2) - 0001, 8(2) - 1000

이제 위 표의 절반을 어떻게 음수로 채워야 할까? 일단 양수처럼 0부터 순차적으로 채워보자.

음수를 이렇게 배치하면, 양수의 첫 번째 비트만 1로 바꾸면 음수가 된다는 장점이 있다.그러나, 두 수를 더했을 때 2진수로 0이 되지 않는다는 것과 0이 두개 (0, -0) 존재한다는 단점이 있다. 게다가 2진수가 증가 할 떄10진 음수는 감소한다.

0 1 0 1 ← 10진수 5
+) 1 1 0 1 ← 10진수 -5
1 0 0 1 0 ← 자리올림이 발생했으나 크기가 4비트라서 버려짐

그러나 위와 같이 '2의 보수법'에 의해 음수를 배치하면, 절대값이 같은 양수와 음수를 더 했을 때 2진수로도 0을 결과로 얻으므로 부호를 신결쓰지 않고 덧셈할 수 있게 된다. 그리고 2진수가 증가할 때 10진 음수가 감소한다는 모순도 없어졌다. 다만, 첫 번째 비트를 바꾸는 것만으로 값의 부호를 바꿀 수 없게 되었다.

0 1 0 1 ← 10진수로 5
+) 1 0 1 1 ← 10진수로 -5
1 0 0 0 0 ← 자리올림이 발생했으나 크기가 4비트라서 버려짐

 

'Java' 카테고리의 다른 글

Java 기본형  (0) 2021.05.29
Java 진법 4  (0) 2021.05.28
Java 진법 2  (0) 2021.05.26
Java 진법 1  (0) 2021.05.25
Java 상수 2  (0) 2021.05.15