2015-01-16 2 views
0
public long bin_to_dec() { 
    int leng = a.length(); 

    for (int i = 0, j = (leng - 1); i < leng; i++, j--) { 

     int number = Character.getNumericValue(a.charAt(j)); 
     result = result + (number * ((long) Math.pow(2, i))); 

    } 
    return result; 
} 

이 코드는 이진 문자열을 인수로 취하여 십진수 값을 반환합니다.
하지만 긴 문자열 즉매우 긴 바이너리 문자열에 대해 음수 값을 반환하는 이유는 무엇입니까?

(111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111) 

는 -28을 반환합니다.
메모리가 범위를 벗어나는 이유는 무엇입니까? 또는 내 코드가 잘못 되었습니까?

+0

http://en.wikipedia.org/wiki/Integer_overflow – iForests

+1

"이 코드는 인수로 이진 문자열을 사용합니다": 사실, BigInteger이 사용할 수있는 기본 방법이있다? 그것은 나에게 niladic 보인다. –

답변

0

int의 길이가 아마도 초과했습니다. 자바에서 정수는 32 비트이고 이진 문자열은 91 비트입니다.

오버플로가 아닌 BigInteger과 같은 것을 사용해보세요. - 당신은 확실

BigInteger result = new BigInteger(a, 2); 
+0

이 질문은 64 비트를 사용하는'long'을 사용합니다. 어느 쪽이든, 그것은 작동하지 않습니다. –

+0

포인트를 얻었는데, 너무 빠르며 '결과'가 선언되어 반환 유형이 누락 된 것을 보지 못했습니다. 아직도 91> 64.;) – Todd

+0

동의. 나는 그런 것들도했습니다. –

관련 문제