본문 바로가기

IT/Linux

각종 진법 변환(2진수 실수끼리의 연산, 실수의 진법변환 등)

각종 진법 변환(2진수 실수끼리의 연산, 실수의 진법변환 등)

>> 2진수를 10진수로 :

10101 = 21

이런 결과가 나오는 이유는

(1 * 2^4) + (0 * 2^3) + (1 * 2^2) + (0 * 2^1) + (0 * 2^0) = 16 + 4 + 1 이다.

여기서 2^4는 2의 4승을 뜻한다. 2의 0승부터 시작해서 마지막 1이 나올때까지 계속 그 승을 올려주면서

곱해주고 그 곱한수들을 합산한다.

이런 계산법을 이용하면 다른 진법도 쉽게 구할수 있다

예를 들어서 3진수를 10진수로 변환한다면

------------------------------------------------------------------------------------------

>> 3진수를 10진수로 :

101(3bit) = 10

(1 * 3^2) + (0 * 3^1) + (1 * 3^0) = 9 + 1 이다.

------------------------------------------------------------------------------------------

>> 10진수를 2진수로 :

그러면 반대로 10진수를 2진수로 바꾼다면?

>> 10진수를 2진수로 :

54 = 110110

54/2 ...... 0

27/2....... 1

13/2....... 1

6/2......... 0

3/2......... 1

1/2......... 1

0

이런식으로 계산을 하고 아래서 부터 합산을 한다.

0110110이 나오는데 제일 앞의 쓸모없는 0을 빼면 110110 이다.

위의 2진수 -> 10진수 연산을 해보면 다시 54가 나오는것을 알수있다.

3진수나 5진수 7진수 기타등등 이런식으로 하면 된다.

이제 부터가 진짜 문제다

------------------------------------------------------------------------------------------

>> 실수형(float) 2진수를 10진수로 :

2진수 실수 0.101을 가지고 계산해 본다.

0.101(2bit) : 2진수 실수 0.101 이란 뜻이다.

아무튼 0.101(2bit)를 10진수로 변환하고자 한다면 두가지 방법이 있다.

십진수를 이용하는 방법과 이진수를 이용하는 방법이다.

우선 십진수를 이용 하는 방법을 사용한다.

이 방법은 division method 라고 한다.

------------------------------------------------------------------------------------------

>> division method : 2bit -> 10bit

0.101(2bit) =

( 0 + 1) / 2 = 0.5

> 여기서 0 + 1의 0 은 처음 시작은 그냥 0부터 시작한다고 외워라

> 0 + 1의 1은 소수 세번째 자리다. 뒤에서 부터 끌어온다.

> /2를 하는 이유는 2진법 이니까

(0.5 + 0) / 2 = 0.25

>여기서 0.5는 앞전 연산의 0.5가 온다.

>0은 소수 두번째 자리수다. 위에서 소수 첫번째 자리를 나눠줬고 순서대로 내려온다.

(0.25 + 1) / 2 = 0.625

> 이렇게 답 0.625가 나온다. 검산은 나중에 하겠다.

하는김에 0.001(2bit)도 해보자

(0 + 1) / 2 = 0.5

(0.5 + 0)/ 2 = 0.25

(0.25 + 0)/ 2 = 0.125 가 나온다.

10진수를 이용한 division method를 이용했으니 이제 2진수를 이용해보겠다.

2진수를 이용한 방법은 multiplication method 라고 한다.

multiplication method를 사용하기전에 우선 2진수 끼리의 곱과 나눗셈을 익혀야 한다.

------------------------------------------------------------------------------------------

>> 2진수 끼리의 곱

0101 * 1010

0 1 0 1

* 1 0 1 0

---------

0 0 0 0

0 1 0 1

0 0 0 0

0 1 0 1

------------

0 1 1 0 0 1 0 = 110010

이 나온다. 여기서 계산법은 0과 1이 만나면 0, 0과 0이 만나도 0, 1과 1이 만나면 1이 되는것이고

그렇게 각 자리수별로 산출한후에 더해주면 되는것이다. 2진수니까 더할때 1과 1이 겹치면 한칸위로

올라가는건 당연한 것이고 C를 하는 사람은 그냥 & 라고 생각하면 되겠다.

검산을 위해 위의 2진수들을 10진수로 변환해보면 5 * 10 = 50이 된다.

그러면 애초에 이런 귀찮은 연산 할것없이 10진수로 변환해서 사용하면 되지 않겠냐고 할것이다.

맞는말이다. 2진수 계산은 사람이 하기에는 실수(error)가 너무 많아서 사용하기가 힘들다.

하지만 컴퓨터는 10진수 계산을 할수가 없다. 그리고 정확하다. 이 계산법을 컴퓨터를 위한것이다.

아무튼 만약 정수형이면 2진수의 곱도 그럭저럭 할만한데 2진수 실수의 곱이라면?

------------------------------------------------------------------------------------------

>> 2진수 실수 끼리의 곱

만약 101.11과 1.001끼리 곱한다고 가정하자

일단 101.11은 5.75이고 1.001은 1.125 이다.

그 곱은 6.46875 이다.

실수의 곱셈도 정수의 곱셈과 별 차이가 없다.

다만 2진수 라는점이 다를뿐이다.

1 0 1 . 1 1

1 . 0 0 1

-------------

1 0 1 1 1

0 0 0 0 0

0 0 0 0 0

1 0 1 1 1

-----------------

1 1 0 0 1 1 1 1

즉 110.01111이 나온다.

위의 변환법을 통해 변환해보면 6.46875가 나옴을 알수있다.

------------------------------------------------------------------------------------------

>> 2진수 끼리의 나눗셈

1100(2bit) = 12

0011(2bit) = 3

좀 조잡하지만 대충 이해하면 되겟다 -_-

그러니까 기본적으로 10진수랑 나눗셈 같다고 보면 된다.

1100이 0011보다 크니까 나눠주는데 최대한 앞에서 나눠준다.

1100/11 하면 그냥 100이다. 즉 12/3 = 4다

이제 나눗셈도 실수로 해보자

위에서 계산한 110.01111에 101 . 11을 나눠보자

1 0 0 1

------------------

1 0 1 . 1 1 / 1 1 0 . 0 1 1 1 1

1 0 1 . 1 1

------------------

0 . 1 0 1 1 1

1 0 1 1 1

------------------

0

2^5 / 2^2 = 2^3

1001 / 2^3 = 1.001

------------------------------------------------------------------------------------------

>> multiplication method : 2bit -> 2bit

원리따윈 패스

그냥 방법만 설명함

위에서 사용한 0.101을 다시 활용함

0.101 X 1010 = 110.010

> 2진수 0.101에 10을 곱해준다. 1010(2bit) = 10 이다. 왜 10을 곱하느냐? 10진수로 전환하니까 ㅇㅋ?

0.010 X 1010 = 10.100

> 여기서 나온 010은 뭐냐? 앞에서 계산한 110.010에서 소수부분만 따온것이다.

0.100 X 1010 = 101.0

> 회수는 세자리니까 세번이다.

110.010

10.100

101.0

이렇게 세가지의 수를 얻었다.

위의 division method에서는 제일 아래수만 취했지만 이방법은 약간 다르다

각 수의 정수부분이 각 소수의 자리수가 되는것이다.

위의 수들을 10진수로 변환해보면 위에서부터 6, 2, 5가 된다.

그래서 0.625가 된다. 참 쉽죠?

------------------------------------------------------------------------------------------

>> 실수형 10진수를 2진수로 변환하는법

그냥 대충 임의의 10진수 6.31을 이진수로 변환해보자

정수부분과 실수 부분을 따로 분리해서 계산한다.

정수부분을 계산해보면 110(2bit) 이다.

실수부분이 문제인데 이역시 정수 계산하듯이 하면 된다.

| 0.31

2 |-----

| 0.62 ....... 0

2 |-----

| 1.22

| 0.22 ....... 1

2 |-----

| 0.44 ........ 0

2 |-----

| 0.88 ....... 0

뭐 대충 이런식이라. 십진수를 이진수로 변환할때처럼 나눠주는게 아니라

이건 거꾸로 곱해주는것이다. 곱하다가 소수부분이 실수로 넘어가게되면

그 수를 옆으로 빼주고 다시 계속 곱해주는것이다.

문제는 가끔씩 딱 0으로 맞아떨어지는수도 있는데 대부분 순환소수가 발생한다는점이다.

그냥 알아서 잘라 먹으면 된다.

위에서부터 소수 첫째자리다 위의 경우는 0.0100이 된다.

아까 계산한 정수부분을 합쳐주면 110.0100(2bit) 가 된다.

이 수를 다시 십진수로 바꿔서 검산을 해보면 6.25가 된다.

분명히 위에서 시작은 6.31 이였다. 근데 왜 결과값은 6.25일까

그 이유는 위에 소수점 변환을 할때 귀찮아서 중간에 잘라서 그렇다.

연산을 진행하면 진행할수록 원본값이 가까워진다.

참고로 소수점 아래 54자리 수는

110.01001111010111000010100011110101110000101000111101

이다.

이걸 다 변환해보면 아마 원본값이랑 비슷하게 될것이다.

----------------------------------------------------------------------------------------------------

대충 여기까지

내가 공부하다가 나중에 햇갈릴때 참고하려고 정리한 자료

참고는 네이버 검색자료들