DY N DY

실력키우기 2진수를 10진수로(JAVA) 본문

PARK/ALGORITHM

실력키우기 2진수를 10진수로(JAVA)

손세지 2016. 4. 4. 11:20

1274 : 2진수를 10진수로...

제한시간: 1Sec    메모리제한: 32mb
해결횟수: 772회    시도횟수: 1299회   



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
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
57
58
59
60
61
62
63
64
65
66
67
68
69
/**************************************************************
    Problem: 1274
    User: a132034
    Language: Java
    Result: Success
    Time:157 ms
    Memory:9656 kb
****************************************************************/
 
 
import java.util.Scanner;
 
public class Main {
  
 @SuppressWarnings("resource")
 public static void main(String[] args) {
  int n;
  Scanner sc = new Scanner(System.in);
  n = sc.nextInt();
  int []b = new int[8];
  int res = 0;
  int mb = 10000000;
  for(int i = 0 ; i < 8 ; ++i)
  {
   b[i] = n / mb;
   n %= mb;
   mb /= 10;
  }
   
  int bb = 1;
  if(b[0] == 0) //양수
  {
   for(int i = 7; i >= 0; --i)
   {
    res += b[i]*bb;
    bb*=2;
   }
  }
  else //음수 - 2의 보수
  {
   int c = 0;
   for(int i = 7; i >= 0; --i) //계산을 위해 다시 2진수로 변경
   {
     
    b[i] = b[i] + 1 + c;
    c = 0;
    if(b[i] > 1)
    {
     c = 1;
     b[i] %= 2;
    }
     
    if(b[i] == 1)
     b[i] = 0;
    else
     b[i] = 1;
   }
    
   for(int i = 7; i >= 0; --i)
   {
    res += b[i]*bb;
    bb*=2;
   }
   res *= -1;
  }
   
  System.out.println(res);
 }
}


입력방법부터 출력방법 까지 여러가지 방법이 있을 수 있음. 

문자열로 입력받는다거나.. 하는 방법등도 있지만 

숫자로 입력받아 이진수의 각 자릿수를 분리하여 배열에 넣음. (문제에서 8자리의 이진수가 입력된다고 정의되어 있으므로 배열의 크기는 8로 고정)

이진수를 만들 때 10000000로 나눈 몫을 배열의 처음에 넣어주고 나머지를 1000000로 나눈 몫을 넣어주는 식으로 하나씩 넣어줌. 


양수의 경우 간단히 각 자릿수에 해당하는 2진수 값을 곱하고 더해서 10진수를 만들어주면 됨. 

음수의 경우 2의 보수 형태로 입력되기 때문에 분기를 해 주었음.

우선 각 자릿수에 1을 더하고 만약 2가 넘으면 c 변수를 이용하여 다음 자릿수로 넘겨줌. 

그리고 각 자릿수를 0이면 1, 1이면 0으로 바꿔주어 원래의 2진수로 만들어 준 후 양수와 동일하게 진행. (마지막에 -1을 곱해줌)




'PARK > ALGORITHM' 카테고리의 다른 글

실력키우기 윤년(C)  (0) 2016.04.06
실력키우기 이진수(C++)  (0) 2016.04.05
실력키우기 팩토리얼(C++)  (0) 2016.04.02
실력키우기 10진수를 2진수로(JAVA)  (1) 2016.04.01
실력키우기 별삼각형2(JAVA)  (0) 2016.03.31