PS/백준

백준 / 수학 / 1373번 / 2진수 8진수 / C++

KimMinJun 2021. 8. 7. 14:11

문제

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자리씩 끊어서 다 더해준뒤 출력해주면 된다.