자바

2012-12-23 4 views
1

나는베이스 2에 기본 10 수를 변환하기 위해 노력하고있어 다시베이스 (10)에 그것은, 내가 얻을 argument_decimal 부정적인 beeing는 경우에만 긍정적 인 argument_decimal자바

argument_binary = Integer.toBinaryString(argument_decimal); 
back_converted_argument_decimal = Integer.valueOf(argument_binary, 2); 

작동을 정수로 다시 부정적 이진 변환 "java.lang.NumberFormatException의 : 입력 문자열 :"이진수 11111111111111111111111111111111 ""EDIT

: 나에게 -1.1이 규정되는 등의 나쁜 결과를 제공

latitude_binary = Integer.toBinaryString((int)(latitude_decimal * 1000000)); 
back_converted_latitude_decimal = Long.parseLong(latitude_binary, 2)/1000000.0; 

을 : 여기 내가 할 것입니다 다시 긴 통해 갈 4293.867296

+0

을 당신은베이스 2베이스 (10), 올바른 의미? – fge

+0

이 맞습니다. 혼란을 가져서 죄송합니다 ... – krzysiek

+0

입력 문자열이 33 자이므로 놀라운 일이 아닙니다. Java 정수는 32 비트만을 커버합니다. 그래서, 정말로 문제가 있습니까? – fge

답변

4

시도로 변환 :

String binary = Integer.toBinaryString(-1); 
long l = Long.parseLong(binary, 2); 
int i = (int) l; 

는 테스트 및 작업.

-1이 시스템 메모리의 32 비트 1 시퀀스로 표시되기 때문에 이것이 작동하는 이유는 무엇입니까? toBinaryString 메서드를 사용할 때 정확한 표현을 사용하여 문자열을 만듭니다. 그러나 하나의 32 비트는 사실 2^32-1과 같습니다. int가 [-2^31, 2^31-1]에서부터 나오기 때문에 int (4 바이트)에 비해 너무 큽니다. 가장 왼쪽 비트가 기호를 나타내는 것이기 때문입니다. 오버플로를 수정하려면 먼저 1 및 0 문자 시퀀스를 Long으로 해석합니다. long의 최대 값은 2^63-1이므로 long을 사용합니다. 그런 다음 long을 int로 변환합니다. 이것은 단순히 하위 32 비트를 취함으로써 수행됩니다.


코드의 버그는 Long.parseLong을 int로 변환하지 않았다는 것입니다. 그래서이 작동합니다 :

lat_bin = Integer.toBinaryString((int)(lat_dec * 1000000)); 
lat_dec_conv = ((int) Long.parseLong(lat_bin, 2))/1000000.0; 
+1

그리고 64 비트보다 큰 수의 경우, 'BigInteger'. – Confusion

+0

하지만 내 상황에 도움이되지 않습니다. (위 코드 참조) – krzysiek

+0

내 업데이트를 확인하고 문제를 발견했습니다. –

0
public static void convertStringToDecimal(String binary) { 
    int decimal = 0; 

    int power = 0; 

    if (binary.charAt(0) == '1' && binary.length() == 32) { 

     StringBuilder builder = new StringBuilder(); 

     for (int i = 0; i < binary.length(); i++) { 

      builder.append((binary.charAt(i) == '1' ? '0' : '1')); 

     } 

     while (binary.length() > 0) { 

      int temp = Integer 
        .parseInt(builder.charAt((binary.length()) - 1)+""); 
      decimal += temp * Math.pow(2, power++); 
      binary = binary.substring(0, binary.length() - 1); 

     } 

     System.out.println((decimal + 1) * (-1)); 

    } else { 

     while (binary.length() > 0) { 
      int temp = Integer 
        .parseInt(binary.charAt((binary.length()) - 1) + ""); 
      decimal += temp * Math.pow(2, power++); 
      binary = binary.substring(0, binary.length() - 1); 
     } 

     System.out.println(decimal); 

    } 
} 
+0

코드 설명 –

+0

@MarlonAbeykoon 첫 번째 if 문은 전달 된 숫자의 '가장 왼쪽 비트가'1 '과 같은지 검사하고 숫자가 음수 인 경우 검사합니다. 다음 단계는 비트를 역변환하여 10 진수 표현을 계산하는 것입니다. 계산에 혼동을 느끼면 [2의 보수] (https://en.wikipedia.org/wiki/Two's_complement)를 조사해야합니다. 희망이 도움이 :) –