Kann mir jemand bei folgendem Programmiercode helfen?
Hallo, kann mir vielleicht jemand bei folgendem Problem weiterhelfen. In dem Code unten sollen Dualzahlen, die in der Methode dualZahl() erzeugt werden durch den Konstruktor in Zweierkomplement Zahlen umgewandelt werden und das durch 0=false und 1=true und dann dem boolean Array namens zk übergeben werden. Leider funktioniert es bei negativen Zahlen nicht, dass die einzelnen Wahrheitswerte umgedreht werden. (Bzw. sie werden umgedreht aber nicht korrekt). Kann mir vill jemand helfen wo mein Fehler liegt?
4 Antworten
Ich hab jetzt nicht das ganze Bild abgeschrieben, um deinen Code zu testen, aber so auf den ersten Blick fällt mir auf, dass du den Parameter in der Funktion dualZahl schon "positiveZahl" genannt hast, weil der eben für positive Zahlen gedacht ist.
In der Schleife sagst du ja auch "while (positiveZahl > 0 ... " also dürfte das für negative Zahlen gar nicht funktionieren.
Außerdem ist das Zweierkomplement einer Zahl auch nichts anderes, als die gleiche Zahl mit umgedrehtem Vorzeichen. Also das Zweierkomplement von 123 ist -123.
Falls das nicht irgendwie eine Aufgabe für die Schule ist, kannst du auch einfach die integrierten Methoden von Java benutzen, um den Binärwert und das Zweierkomplement zu ermitteln.
public class Zweierkomplement {
public static void main(String[] args) {
long testZahl = 123L;
System.out.println("Binärwert: " + Long.toBinaryString(testZahl));
System.out.println("Binärwert mit führenden Nullen: " + padding(Long.toBinaryString(testZahl)));
System.out.println("Zweierkomplement: " + Long.toBinaryString(testZahl * -1));
System.out.println("Zweierkomplement mit führenden Nullen: " + padding(Long.toBinaryString(testZahl * -1)));
}
private static String padding(String input) {
return String.format("%64s", input).replace(' ', '0');
}
}
Die Funktion dualZahl() bekommt schon den richtigen Wert in Binärdarstellung. Das passt auch für positiveZahl<0.
Dummerweise dividierst Du positiveZahl (mehrfach) durch 2, aber dabei wird immer gegen 0 gerundet. -1/2 wird zu 0, und Deine Schleife bricht dann sofort ab, anstatt alle 32 Bits zu ermitteln.
Mit „positiveZahl >>= 1;“ (statt „/=basis“) sollte es besser klappen, denn dabei bleibt das Vorzeichen (Bit 31) erhalten. Das gilt aber nur für basis=2.
Für basis=2ⁿ kannst Du analog „>>=n“ schreiben. Für beliebige Basen bleibt Dir wohl nichts anderes übrig, als das Abrunden zu erzwingen:
positiveZahl = (positiveZahl+basis-1)/basis-1; // abrunden
positiveZahl = (positiveZahl+basis-1)/basis-1; // abrunden
Sorry, das funktioniert nicht. Vergiss es einfach!
positiveZahl = (positiveZahl+basis)/basis-1; // abrunden
könnte vielleicht klappen.
Bei negativen Zahlen funktioniert es wie folgt:
1. Zahl ganz normal ins duale Zahlensystem umwandeln
2. Komplement bilden
3. +1 rechnen
Da fehlt dir noch was ;)
Das war einfach ne foreach schleife...
Ist identisch zu:
for(int i = 0; i < zk.Length; i++)
zk[i] = !zk[i];
Da spart man sich halt den Zähler und muss nicht per Index aufs Array drauf.
num war halt einfach ein name für die Variable
Ganz spontan.
Prüfen, ob die Zahl negativ ist und wenn ja "Zahl * (-1)" rechnen. und am Ende nochmal mal -1 rechnen.
Ist aber wahrscheinlich eine Umständliche Variante....
Der zweite Schritt funktioniert ja schon nicht richtig.