JAVA LV 1-3

진법

Posted by Gihoon on March 12, 2023
  • 10진법과 2진법 우리가 일상생활에서 주로 사용하는 것은 10진법이다. 반면 컴퓨터는 2진법이 적합하다. 2진법은 0과 1로만 데이터를 표현하기 때문에 10진법에 비해 많은 자리수를 필요로 한다. 10진수 2와 같이 작은 숫도 2진수로 표현하려면 2자리가 필요하다. 2진수 한자리로는 1보다 큰 값을 표현할 수 없기 떄문이다. 이것은 10진수에서 9보다 큰 수를 표현하기 위해서는 두 자리의 10진수가 필요한 것과 같다.

그래서 2진수 1에 1을 더하면 2가아닌 10이 되고, 2진수 11에 1을 더하면 12가 아닌 100이 된다.

자리수는 많이자긴 해도 2진수는 10진수를 온전히 표현할 수 있다. 게다가 덧셈이나 뺼셈같은 연산도 10진수와 동일하다

  • 비트와 비이트 한 자리의 2진수를 비트라고 하며 , 1비트는 컴퓨터가 값을 저장할 수 있는 최소단위이다. 그러나 1비트는 너무 작은 다위이기 때문에 1비트 8개를 묶어서 ‘바이트’라는 단위로 정의해서 데이터의 기본단위로 사용한다. 이 외에도 ‘워드’라는 단위가 있는데, 워드는 ‘CPU가 한번에 처리할 수 있는 데이터의 크기’를 의미한다. 워드의 크기는 CPU에 성능에 따라 다른데 32비트 CPU에서 32비트(4바이트)이고, 64비트 CPU에서는 64비트 (8바이트)이다.

비트는 n비트 2^n개의 값을 표현할 수 있다. 그리고 n비트로 10진수를 표현 한다면 표현 가능한 10진수의 범위는 0~2^n-1이 된다.

따라서 n비트로 표현할 수 있는 10진수의 값의 개수는 2^n , 값의 범위는 0~2^n-1 이다.

  • 8진법과 16진법 2진법으로 값을 표현하면 자리수가 상당히 길어진다는 단점을 보완하기 위해 2진법 대신 8진법이나 16진법을 사용한다.

8진수는 2진수 3자리를, 16진수는 2진수 4자리를 각각 한자리로 표현할 수 있기 때문에 자리수가 짧아져서 알아보기 쉽고 서로 간의 변환방법 또한 매우 간단하다. img 출처:EVH의 잡동 창고

8진법은 값을 표현하는데 8개의 기호가 필요하므로 0

7의 숫자를 기호로 사용하지만 16진법은 16개의 기호가 필요하므로 6개의 문자 (A

F)를 추가로 사용한다.

2진수를 8진수, 16진수로 변환 2진수를 8진수로 변환하려면, 2진수를 뒤에서 부터 3자리씩 끊어서 그에 해당하는 8진수로 바꾸면 된다. 2진수를 16진수로 변환하는 방법 또한 비슷한데 3자리가 아닌 4자리씪 끊어서 바꾼다는 점만 다르다.

1010101100(2) = 1254(8) = 2AC(16) 으로 나타낼 수 있다.

  • 정수의 진법 변환 10진수를 다른 진수로 변환 하려면, 해당 진수로 나누고 나머지 값을 옆에 적는 것을 더이상 나눌 수 없을 때까지 반복한 다음 마지막 몫과 나머지를 아래부터 위로 순서대로 적으면 된다. 자세한 방법은 예제를 풀면서 이해하도록 하자.

어떤 진법의 수를 10진수로 변환하는 방법은 항상 똑같다. 각 자리의 수에 해당 단위의 값을 곱해서 모두 더하면 된다.

예를 들어 10진수 123을 풀어쓰면 123(10)= 100 + 20 + 3 = 1100+210+3*10^0

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

101110 =

$12^5+02^4+12^3+12^2+12^1+02^0=32+8+4+2=46\left(10\right)$125+024+123+122+121+020=32+8+4+2=46(10)​

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

  • 실수의 진법변환 앞서 10진 정수를 2진 정수로 변환할 떄, 10진수를 2진로 계속 나누었던 방법을 기억할 것이다. 10진 소수 점수를 2진 소수 점수로 변환하는 방법은 이와 반대로 10진 소수점수에 계속 2를 곱한다. 예를 들면 아래와 같다.

10진 소수에 2를 곱한다. 0.625 * 2 = 1.25

위의 결과에서 소수부만 가져다가 다시 2를 곱한다. 0.25 * 2 = 0.5

소수부가 0이 될 때 까지 반복한다. 0.5 * 2 = 1.0

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

0.625(10) = 0.101(2)

2진 소수점수를 10진 소수점수로 변환하는 방법 반대로 2진 소수를 10진소수로 바꿔서 0.101(2) 가 정말로 0.625가 되는지 확인해보자

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

0.101(2) =

$1\cdot 2^{-1}+0\cdot 2^{-2}+1\cdot 2^{-3}=0.625$1·2−1+0·2−2+1·2−3=0.625​

위의 계산과정을 통해 0.101(2)이 0.625(10)라는 것을 확인할 수 있다.

  • 음수의 2진표현 - 2의 보수법 앞서 살펴본 것과 같이 n비트의 2진수로 표현할 수 있는 값의 개수는 모두 2^n개 이므로 4비트의 2진수로는 모두 16개의값을 표현할 수 있다.

그러면 4비트의 2진수로 부호있는 정수, 즉 양수와 음수를 표현해보자. 2-zin 출처:하우의 대학생 일기

4비트의 절반인 8개는 0으로 시작하고 나머지 절반은 1로 시작하니까 1로 시작하는 2진수를 음수 표현에 사용하자.

이렇게 하면, 왼쪽의 첫번째 비트가 0이면 양수 1이면 음수이므로 첫번째 비트만으로 값의 부호를 알수 있게된다.

위의 표에서 보이는 것처럼 부호있는 10진수로 표현을 하였을 때 양수의 첫번째 비트만 1로바꾸면 음수가 된다는 장점이 있다.

하지만 두 수를 더했을 때 2진수로 0이 되지 않는 다는 것과 0이 두개 존재한다는 단점이 있다. 게다가 2진수가 증가할때 10진음수는 감소한다. 10-zin 출처: donghankim01님의블로그

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

2의 보수법 어떤 수의 ‘n의 보수’는 더했을 때 n이되는 수를 말한다. 7의 ‘10의 보수’는 3이고 3의 ‘10의 보수’는 7이다. 3과 7은 ‘10의 보수의 관계’에 있다고 한다. ‘2의 보수 관계’역시 더해서 2가 되는 두수의 관계를 말하며 10진수 2는 2진수로 ‘10이다’ 2진수 ‘10’은 자리올림이 발생하고 0이 되는 수를 뜻한다. 그래서 ‘2의 보수 관계’에 있는 두 2진수를 더하면 자리올림이 발생되고 0이 된다.

예를 들어 2진수 ‘0101’ 과 ‘1011’은 서로 ‘2의 보수 관계’에 있으며 이 두 2진수를 더하면 0이 된다. 이 덧셈이 10진수로도 0이 되려면 ‘0101’가 10진수로 5이기 때문에 2진수’1011’은 10진수로 -5이어야 한다. 따라서 2의 보수관계는 부호가 다르고 절대값이 같은 수이다.

현재 대부분의 시스템이 ‘2의 보수법’으로 부호있는 정수를 표현한다.

음수를 2진수로 표현하기 10진 음의 정수를 2진수로 표현하려면, 먼저 10진 음의 정수의 절대값을 2진수로 변환한다. 그 다음에 이 2진수의 ‘2의 보수’를 구하면 된다.

예를 들어 -5의 2진표현을 구해보자. -5 >절대값> 5 > 2진수 > 0101 > 2의 보수 > 1011 이다.

2의 보수 구하기 서로 ‘2의 보수’의 관계에 있는 두 수를 더하면 ‘0 (자리 오림 발생)’이 된다.

‘2의 보수’를 간단히 구하는 방법중 하나는 ‘1의 보수’를 구한 다음 1을 더한다. 그러면 2의 보수를 구할 수 있다 ( 2의 보수 = 1의 보수 + 1)

‘1의 보수’는 0을 1로, 1을 0으로 바꾸면 되므로 구하기 쉽다. 예를 들어 , 2진수 ‘0101’의 ‘1의 보수’는 ‘1010’이다. 여기서 1을 더하면 2의 보수가 된다. ( 1011)

왜 “1의 보수 + 1”은 ‘2의 보수’ 인가? 어떤 2진수가 있을 때, 이 2진수의 1의 보수를 더하면 모든 자리가 1이 된다.

0101 + 1010 = 1111

위의 식에서 양변에 1을 더하면 우변은 0이 된다.

0101+ (1010+1) = 10000

올림이 발생하지만 4비트를 넘는 값이라 저장할 공간이 없어서 버려진다.

따라서 “1의 보수 + 1”은 ‘2의 보수’이다.

결과적으로 2진 표현을 구하는 방법은 다음과 같다 (1)음수의 절대값을 2진수로 변환

(2)(1)에서 구한 2진수의 1을 0으로 0은 1로 바꾼다 ( 1의 보수 구하기)

(3)(2)의 결과에 1을 더한다. (2의 보수구하기)