林's

[C++] 2진수 출력하는 방법 본문

프로그래밍/알고리즘

[C++] 2진수 출력하는 방법

풀림이 2019. 3. 25. 22:07

이전 포스팅에서 다뤘던 2진수 출력은 스택과 재귀를 연습하기 위함이었습니다.

비트연산을 사용하면 더욱 쉽고 빠르게 10진수를 2진수로 바꿀 수 있습니다.

물론 음수도 변환 가능해지겠죠?. 스택도 필요없이 간단한 char 문자열 배열만 있으면 됩니다.

toBinaryString(const int & n ) 은

정수를 입력받아 2진수로 변환 된 값을 문자열로 리턴해주는 역할을합니다.

가장 먼저, 32비트 정수를 위한 32개의 자리와 문자열임을 생각하여 마지막 NULL문자(‘\0’)를 포함하여 총 33개의 char 를 동적할당 받습니다. ( 안 그러면 지역변수의 포인터를 반환해서 이상한 값이 들어가고 말지요! )

반복문의 시작이 31부터인 이유는 최상위 비트는 32번째에 있고 31번 오른쪽으로 당겨와야 000 …. 0000 1과 & (AND) 연산을 수행할 수 있기

때문입니다. 이걸 이해하셨다면, 반복문을 돌 때마다 1씩 감소가 되면 31번째 비트가 1과 & 연산을 할 것이고 이를 통해(a & b 는 둘다 1이여야 1) 각 자리가 무슨 비트인지를 알 수 있게 됩니다. 그리고 이렇게 나온 값은 0 또는 1로 나오겠죠? 그런데 char 입장에서 0과 1은 널문자와 SOH(start of header) 문자입니다.

따라서 이를 char형으로 바꿔줄 필요가 있는데. 무턱대고 (char)이라고 해봤자 숫자 0이 문자 ‘0’ 이 되지 않습니다.

문자 ‘0’은 아스키코드 상에서 48번입니다. 따라서 0은 0 + 48, 1은 1+48을 해서 아스키코드 48번과 49번을 넣어줘야겠죠!

그래서 끝에 48을 더한 것입니다. 그리고 마지막으로 널문자를 끝에 삽입함으로써 cout 이 이를 문자열로 인식하게 해줍니다.

설명이 좀 길었지만, 재귀랑 스택을 사용하는 것보다 훨씬 간단하쥬?

 

추가로 bitset 라이브러리에도 10진수를 2진수로 바꿔주는 함수가 있습니다.

bitset<비트개수>(10진수).to_string() 하시면 10진수를 2진수로 바꾼 문자열이 반환됩니다.

탬플릿 칸 안에 비트개수가 들어가는게 좀 특이하군요? 비트셋은 상태를 기록하는데 참으로 유용한 친구니

익혀두시면 도움이 많이 될것입니다!

그리고 한 가지 특이한 경우로 처음의 코드와 달리 밑의 코드에서는 toBinaryString() 이 지역변수를 리턴함에도 불구하고 컴파일러가 에러를

발생시키지 않는군요? 이는 string 이 객체이기 때문에 나중에 디스트럭터가 실행돼서 한 번 쓰인 다음에 문자열이 사라지기 때문인 것 같습니다. 또 다른 생각을 해보면, 문자열은 rodata 라는 섹션에서 관리가 되고 있기 때문에. 이 쪽에서 캐싱돼서 쓰이는 한 프로그램이 종료돼야 사라질 것 같군요. 이상으로 10진수를 2진수로 바꾸는 법에 대해서 여러가지 방법으로 알아보았습니다. 즐거운 하루 되세요~

Comments