2014-07-09 2 views
0

에서 진수하는 대형 바이너리 문자열로 변환 (우리는 먼 길을해야만한다).여기에 약간의 도움이 필요 자바

16 진수 값을 2 진수로 성공적으로 변환했지만 이진 문자열을 10 진수로 변환하는 데 문제가 있습니다. 출력이 올바르지 않습니다. 이 섹션에서는 도움이 필요하므로 이해하고 설명하기 쉽도록 변환해야하는 첫 번째 이진 값을 넣으면됩니다. 2147483647 //이 올바르지 않습니다 여기에 지금까지

public class binToDec { 

    public static void main(String[] args) { 
     int decimal = 0; 
     String binary = "101010111100110111101111101010111100"; 
     for (int pow = (binary.length()-1); pow > -1; pow--) { 
      if (binary.charAt(pow)=='1'){ 
      decimal += (Math.pow(2, pow)); 
      } 
     } 
     System.out.print(decimal); 
    } 
} 

실행 한 것입니다. 그것은

46118402748 당신의 도움이

+0

할당을 시도 할 수 있습니다, 당신은 방법에 의해 urself에 .. 시도 할 수 있습니다, 자바 클래스 이름이 될하고자하는'BinToDec'가 아닌'binToDec' – spiderman

답변

2

코드에 2 가지 문제가 있습니다. int 2^31 만 값을 보유 할 수 있기 때문에

  1. 오버플 확실히 발생 - 1과 binary 문자열 이상 31 비트가있다. decimallong으로 선언하십시오. decimal에 추가 할 때

    long decimal = 0; 
    
  2. 당신은 루프의 잘못된 끝에서 지수를 적용하고 있습니다. 0 문자가 가장 중요하지만 가장 중요한 숫자 인 것처럼 0의 지수로 보내고 있습니다. Math.pow이 과잉으로 간주 될 수 사용 (이 lenint len = binary.length();로 선언 가정합니다.)

    decimal += (Math.pow(2, (len - pow - 1))); 
    

    을보십시오. 또한

    decimal += 1L << (len - pow - 1); 
    
+0

당신의 대답은 나의 것보다 낫지 만 하나의 편집은 "당신의'binary' 문자열에 32 * 비트 이상이 있어야합니다. – Jashaszun

+0

@Jashaszun 자바에서는 'int'가 서명되어 있으므로 가장 중요한 32 번째 비트를 사용하면 오버플로가 발생합니다 (설정되어있는 경우). 사실 'long'을 사용하면 문제가 없어지지 만, 'binary' 문자열에 63 비트가 넘으면 오버 플로우 문제가 발생합니다. – rgettman

+0

답변 해 주셔서 감사합니다. 완벽하게 작동하도록했습니다! – MrSpyGuy

0

자바 int 32 비트, 그리고 이진 문자열 36 비트가 있기 때문에 그것은 작동하지 않습니다 주셔서 너무 감사해야합니다. 이로 인해 오버플로가 발생합니다.

+0

나는 어떤 종류를 사용할 수 있습니까? – MrSpyGuy

+0

64 비트이기 때문에 길다. – Jashaszun

관련 문제