java

#쉽게 푸는 알고리즘 #2 [16진수 - > 2진수 변환]

sieunju 2017. 1. 25. 00:59
반응형

안녕하세요 j.sieun 입니다. 

오랜만에 자바에 알고리즘에 대해서 포스팅을 합니다. 


친구랑 진수에 대해서 얘기하다가 이걸 가지고 알고리즘을 한번 만들어봐야겠다 생각하고 한번 코딩해보았습니다.


우선 제가 1차로 코딩한 것이므로 소스 "단순화" 를 거치지 않은 즉, 다듬어 지지 않은 코딩이라고 볼수 있습니다.


문제 4자리 16진수 숫자 또는 문자열을 가지고, 이것을 2진수로 변환하여라


그럼 소스부터 보도록 하겠습니다.



아주 간단히 주석처리를 해서 참고로 하시면됩니다. 

이 알고리즘을 만들기 위해서는 아스키 코드를 알고 계셔야 합니다. 

//저는 구글링해서 아스키 코드를 보고 풀었습니다. :)

참고..입니다.


그럼 소스 해석을 하도록 하겠습니다.


1.메인함수 (public static void main) 에서는 큐에다가 값을 추가하는 부분이 되겠습니다.

//편의상 큐에다가 값을 추가한것이고, 배열로 하는 방법도 있습니다. :)


2. HexCode 함수에서는 큐에 저장된 값들을 하나씩 뽑아서 그것들을 ConverSion 라는 함수로 보내서 

"2진수" 로 변환 하는 함수가 되겠습니다. 

여기서 가장 중요한 부분은 


이부분이 되겠는데요.

_hex[j] = _str.charAt(j);

_str 의 문자열의 문자 "하나" 씩 char 형으로 _hex 배열에 추가 합니다. 그렇게 되면 _hex는 아스키 코드표에 있는 값들로 저장이 됩니다. 

그리고 16진수가 어떤 개념인지 아셔야 합니다. 16진수란? 예를 들면 "17" 을 16진수로 변환하면 "11" 이 되는 것으로 알고 계시면 됩니다. 


여기서 아스키 코드를 보시면, 0~9까지는 16진수가 0~9까지 이루어져있다가 10~15까지는 A~F 로 이루어져 있습니다. 그 이후로도 계속 해서 반복되어있다는 것을 볼수 있습니다.

 

그래서 처음 조건문에서 0~9까지 에서는 char 의 값을 그대로 변환합니다. 

//제 소스에서는 _hex[j] - '0' 으로 되어있는데 굳이 '0' 은 안넣어도 됩니다.


그리고, 그 다음 조건문에서는 _hex[j] - 'A' + 10 한 상태에서 ConverSion 함수로 보내는 것으로 되어있습니다. 

이유는 아스키 코드에서 A 의 값부터 F 의 값은 10진수로는 65~70으로 되어있는데 이를 10~15 인 값으로 변환할려면 'A' 를 빼고 + 10 을 해야 10 ~ 15 가 됩니다. 이렇게 해야 4자리 2진수로 변환 할 수 있습니다.


10을 더 한 이유는 10부터는 숫자가 아닌 알파벳 A부터 시작하기 때문에 10을 더했습니다.


설명을 좀더 쉽게 하자면, 16진수가 0~9까지와 10부터는 알파벳 A~F(15) 로 되어있는 진수를 뜻합니다.

그래서 이것을 2진수로 나타낼려면 A가 가지고있는 고유 아스키 번호가 아닌, 10으로 변환후 2진수로 나타내어야 합니다. 그래서 저는 알파벳이 들어간 부분은 A or a 를 뺀후 10을 더했습니다. 그렇게 되면 10~15 로 변환되어서 

2진수로 나타낼수 있기 때문입니다. 


3. ConverSion 함수에서는 0~15까지의 값을 2진수로 나타내는 아주 간단한 함수가 되겠습니다. 


첫번째 반복분을 보자면, 왜 i의 초기값이 3인가에 대해서 의문점이 들텐데요 그이유는 간단합니다. 

아주 쉽게 그림으로 설명하도록 하겠습니다. 


이진수로 값을 표현할때 밑에서 부터 값을 표현하기 때문에 i의 초기값을 3으로 두었습니다.


4. Output 함수 부분은 이러한것들을 


_OutputHex 라는 큐에 저장했다가 차례대로 값을 출력하는 부분이 되겠습니다. 



이렇게 값이 4자리 16진수를 2진수로 출력이 된 부분을 보실수 있겠습니다. 



이상 포스팅을 마치도록 하겠습니다.

감사합니다. 

기타 이해 안되는 부분 있으시면, 댓글 남겨주시면 답변 해드리도록 하겠습니다.






반응형