문제
2진수가 주어졌을 때, 8진수로 변환하는 프로그램을 작성하시오.
입력
첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.
출력
첫째 줄에 주어진 수를 8진수로 변환하여 출력한다.
예제 입력 1
11001100
예제 출력 1
314
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string result = "";
string n;
cin >> n;
if(n.length() % 3 == 1) n = "00" + n;
else if(n.length() % 3 == 2) n = "0" + n;
int len = n.length();
for(int i=2; i<=len; i+=3) {
int sum = 0;
int bit_1 = n[i] - '0';
int bit_2 = (n[i - 1] - '0') << 1;
int bit_3 = (n[i - 2] - '0') << 2;
sum = bit_1 + bit_2 + bit_3;
result += to_string(sum);
}
cout << result << '\n';
return 0;
}
일단 2진수에서 8진수로 바꾸는 법은 2진수의 3개의 bit를 8진수의 1개의 bit로 변환하는 것이다.
예를들어, 111101(2)라면, 111(2) / 101(2) 이렇게 3개씩 끊어서 10진수로 나타낸뒤 붙여주면 8진수가 된다.
따라서 75가된다.
하지만 2진수의 길이를 나눴을때 나머지가 생기는 경우가 발생할 수 있는데, 1이 남을경우엔 앞에 "0"을 붙여주고,
2가 남을경우엔 앞에 "00"을 붙여주면 수엔 변화가 없다.
그리고 위에서 bit연산이 사용되었는데, 예를들어 숫자 << n 은 숫자에 2의 n제곱만큼 곱해주겠다는 뜻이다.
shift연산이라고 하는데, 쉽게 말하면 2진수에서 왼쪽으로 한자리 옮겨간다고 생각하면된다.
따라서 예를들어 111(2)가 있으면 1*4 + 1*2 + 1*1 을 해주면된다.
그렇게 3자리씩 끊어서 다 더해준뒤 출력해주면 된다.
'PS > 백준' 카테고리의 다른 글
백준 / 수학 / 2089번 / -2진수 / C++ (0) | 2021.08.09 |
---|---|
백준 / 수학 / 1212번 / 8진수 2진수 / C++ (0) | 2021.08.08 |
백준 / 수학 / 17087번 / 숨바꼭질 6 / C++ (0) | 2021.08.06 |
백준 / 수학 / 9613번 / GCD합 / C++ (0) | 2021.08.05 |