2016-10-18 32 views
6

Mam binarny represenation numeru i chcą przekształcić go długo (mam Java 8)Java - przetwarza binarne długo

public class TestLongs { 
public static void main(String[] args){ 
    String a = Long.toBinaryString(Long.parseLong("-1")); // 1111111111111111111111111111111111111111111111111111111111111111 
    System.out.println(a); 
    System.out.println(Long.parseLong(a, 2));// ??? but Long.parseUnsignedLong(a, 2) works 
} 

}

Ten kod powoduje Exception in thread "main" java.lang.NumberFormatException: For input string: "1111111111111111111111111111111111111111111111111111111111111111" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 1111111111111111111111111111111111111111111111111111111111111111 at java.lang.Long.parseLong(Long.java:592) Co jest źle tutaj? Dlaczego Long.parseLong (a, 2) nie działa?

Odpowiedz

5

Long.parseLong() nie traktuje pierwszego znaku "1" jako bitu znaku, więc liczba jest analizowana jako 2^64-1, która jest zbyt duża dla long. Long.parseLong() oczekuje wejścia String s, które reprezentują liczby ujemne zaczynające się od "-".

Aby Long.parseLong(str,2) Aby powrócić -1, należy przejść do niej String, które zaczynają się od „-”, a kończy z binarnej reprezentacji 1 - tj Long.parseLong("-1",2).

+1

to co jest różnica między Long.parseLong i Long.parseUnsignedLong? czy "Bez znaku" odnosi się do reprezentacji binarnej lub długiej wartości? –

+1

@android_dev parseUnsignedLong oczekuje traktowania długich wartości tak, jakby były niepodpisane. –

+1

'Long.parseUnsignedLong' traktuje wyjście' long' jako niepodpisaną wartość, więc gdy potraktujesz wartość 'long' jako unsigned, maksymalna możliwa wartość stanie się 2^64-1 (reprezentowana przez 64 1-bity), dlatego dozwolony jest ciąg 64 1 s. @android_dev – Eran

2

Eran jest prawo, a odpowiedź na to pytanie brzmi:

System.out.println(new BigInteger(a, 2).longValue());