Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Binärdarstellung (als String) in Dezimalzahl umwandeln
Hallo
ich soll eine Methode static lon convertBinaryToDecimal( String binaryNumber) implementieren, die eine Zahl in Binärdarstellung (als Text) in eine Dezimalzahl umrechnet.
Das habe ich auch soweit versucht nur irgendwie wird mir immer nur 0 ausgegeben und ich finde meinen Fehler leider nicht
Java:
static long convertBinaryToDecimal(String binaryNumber){
double sum = 0;
int m = binaryNumber.length()-1;
for (int i=0; i< binaryNumber.length(); i++) {
char pos = binaryNumber.charAt(i);
if ( pos == 1 ){
sum = sum + Math.pow(2.0, m);
m = m - 1;
}
else
{m = m - 1;
}
}
long zahl = (long) sum;
return zahl;
}
public static void main(String[] args) {
System.out.print(convertBinaryToDecimal("0111101"));
}
pos ist vom Typ char, also ein Zeichen des Strings. Das bedeutet, dass darin ein ASCII-Wert gespeichert ist. Du vergleichst nun mit dem ASCII-Zeichen, das an der ASCII-Tabelle an Stelle 1 steht, also irgendeinem Steuerzeichen.
Wenn du mit dem ASCII-Zeichen für die Ziffer 1 vergleichen möchtest, geht das so:
Java:
if ( pos == '1' ){
Allgemein gilt: Wenn man ein Zeichen in ' ' setzt, ersetzt der Compiler es durch den ASCII-Code des Zeichens.
PS: Möchtest du als Typ wirklich double verwenden? Du behandelst ja nur natürliche Zahlen ohne Kommastellen
Dankeschön!!
Ich hab das zuerst auch mit einem int sum probiert, also so:
Java:
static long convertBinaryToDecimal(String binaryNumber){
int sum = 0;
int m = binaryNumber.length()-1;
for (int i=0; i< binaryNumber.length(); i++) {
char pos = binaryNumber.charAt(i);
if ( pos == '1' ){
sum = sum + Math.pow(2, m);
m = m - 1;
}
else
{m = m - 1;
}
}
long zahl = (long) sum;
return zahl;
}
aber dann wird mir der folgende Fehler ausgegeben:
\Desktop\Uni\PraktInfo▄bungsblõtter\Ubungsblatt6\Blatt6.java:52: error: possible loss of precision
sum = sum + Math.pow(2, m);
^
required: int
found: double
1 error
<<< Process finished. (Exit code 1)
dann habe ich das so verstanden, dass dieser Ausdruck sum + Math.pow(2, m) ein double ist (versteh allerdings nicht warum) und deswegen habe ich dann sum zu einem double gemacht...
Aber wenn das auch irgendwie mit int sum geht wäre natürlich schöner
Du hast richtig erkannt, dass es daran liegt, dass Math.pow(2, m) ein double zurückgibt Das liegt daran, dass Math.pow nicht nur für ganzzahlige Potenzierungen verwendet werden kann, sondern für beliebige.
Du könntest es nun folgendermaßen lösen:
Java:
sum = sum + (int) Math.pow(2, m);
Damit wandelst du die double sofort in einen int um, sodass deine Summe ein sauberer int bleiben kann.
Später lernt ihr vielleicht noch, wie man das ohne Math.pow machen kann - mithilfe des Shift-Operators <<. Aber ich denke, dass ihr den noch nicht hattet und deine Lösung so gut ist
Oh, auf das mit dem (int) Math.pow(2, m) hätte ich kommen können...
Diesen Shift-Operator kenne ich, mit dem hab ich sogar schon gearbeitet, aber mir fällt jetzt spontan nicht ein, wie ich mit dem das Math.pow umgehen könnte...
Ich habe mich auch grade hingesetzt und habe alles mögliche ausprobiert mit nach rechts shiften und nach links shiften, aber sich sehe da echt keinen Zusammenhang.
Das interessiert mich jetzt wirklich, wie würde das denn gehen?
aber irgendwie baue ich das falsch in meine Funktion ein...
Java:
int sum = 0;
int m = binaryNumber.length()-1;
for (int i=0; i< binaryNumber.length(); i++) {
char pos = binaryNumber.charAt(i);
if ( pos == '1' ){
sum = sum + 1 << m;
m = m - 1;
}
else
{m = m - 1;
}
}
long zahl = (long) sum;
return zahl;
}
Hmpf.. ich hatte mir im Kopf schon Erklärungen überlegt, wie ich dir nach deiner Antwort den Zusammenhang der Binärdarstellung der Potenzen und der Shift-Operation erklären kann - und jetzt hast du es einfach schon gelöst Super!
Zu dem verbleibenden Problem: Die Operator-Rangfolge ist in Java wenig intuitiv, die Shift-Operation wird erst nach der Addition gemacht, d.h. sum + 1 << m entspricht (sum + 1) << m. Ein paar Klammern werden da Abhilfe schaffen