일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Spring
- 인공지능
- BFS
- 리눅스
- 타입제한
- 파이썬
- 검색어최적화
- 연결리스트구현
- Java
- 주피터
- 딥러닝
- 스프링
- 리스트구현
- 서버사이드랜더링
- spa 라우팅
- 리스트
- 텐서플로우
- SPA
- 고쳐야해!
- 머신러닝
- 알고리즘
- let과var차이
- jnut
- 백준
- BOJ
- SWEA
- 드래그방지
- 파이프 옮기기
- 타입변수
- BOJ17070
- Today
- Total
林's
[C++] 2진수 출력하는 방법 본문
이전 포스팅에서 다뤘던 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진수로 바꾸는 법에 대해서 여러가지 방법으로 알아보았습니다. 즐거운 하루 되세요~
'프로그래밍 > 알고리즘' 카테고리의 다른 글
[자료구조 JAVA] Singly LinkedList 구현하기 (0) | 2019.10.16 |
---|---|
[알고리즘] 달팽이 수열 (0) | 2019.06.20 |
[자료구조] Queue 와 LinkedList (0) | 2019.04.13 |
[Algorithm] 멱집합(powerSet)알고리즘 (0) | 2019.03.25 |