2진수를 입력받아 10진수로 바꾸어주는 프로그램을 작성하시오.
입력받는 2진수는 8비트로 구성되어있으며 최상위비트는 부호비트이다.
즉, 최상위 비트의 값이 0이면 양수, 1이면 음수이며 음수의 경우 2의 보수로 구성되어있다.
최상위 비트를 제외한 나머지 7개의 비트를 1, 2의 보수로 바꾸는 방법:
1의 보수는 2진수의 1과 0을 바꾸면 된다.
1101000 -> 0010111
(2진수) (1의 보수)
2의 보수는 1의 보수의 마지막 비트에 1을 더한다.
0010111 (1의 보수)
+ 1
---------
0011000 (2의 보수)
입력의 첫 줄에 8자리의 2진수가 들어온다.
출력의 첫 줄에 10진수로 변환한 값을 출력한다.
[Copy]
00000101 |
[Copy]
5 |
[Copy]
10011000 |
[Copy]
-104 |
이전과 마찬가지로 기본 문제에서 힌트를 준 뒤 거기에 응용하는 식으로 문제가 나왔습니다.
이번에도 간단하게 해결 할 수 있었는데, 부호가 있다는 것만 주의하면 될 것 같습니다. 사실 부호 변환도 친절하게 다 알려줬군요.
부호 변환시에 1을 더해주는 것에서 조금 더 깔끔하게 할 수도 있을 것 같은데 당장 생각이 나질 않네요.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 |
#include <iostream>
#include <string>
using namespace std;
int B2N(string bin, int len);
int ToInt(char c);
int MinusChecker(string& bin);
int main(void)
{
string binary;
int sign;
cin >> binary;
sign = MinusChecker(binary);
cout << sign * B2N(binary, binary.size()) << endl;
}
// 2진수를 10진수로 변환하는 함수
int B2N(string bin, int len)
{
if (len == 0) return 0;
return B2N(bin, len - 1) * 2 + ToInt(bin[len - 1]);
}
int ToInt(char c)
{
return c - '0';
}
int MinusChecker(string& bin)
{
// 음수가 아닌 경우 조기 리턴으로 종료(아무 처리 안함)
if (bin[0] != '1') return 1;
// 음수인 경우 2의 보수를 취해 수를 파악한다.
// 먼저 0<->1 교환한다.
for (int i = 0; i < bin.size(); ++i)
bin[i] = (bin[i] == '1') ? '0' : '1';
// 이후 1을 더한다.
for (int i = bin.size() - 1; i >= 0; --i)
{
if (bin[i] == '1')
{
bin[i] = '0';
}
else
{
bin[i] = '1';
break;
}
}
return -1;
}
|
cs |
JUNGOL) 문제은행) 실력키우기) 2진수를 10진수로