Kann mir jemand bei folgendem Programmiercode helfen?

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

ralphdieter  05.02.2021, 16:35
positiveZahl = (positiveZahl+basis-1)/basis-1; // abrunden

Sorry, das funktioniert nicht. Vergiss es einfach!

positiveZahl = (positiveZahl+basis)/basis-1; // abrunden

könnte vielleicht klappen.

0

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 ;)


Steffi1997563 
Beitragsersteller
 05.02.2021, 11:17

Der zweite Schritt funktioniert ja schon nicht richtig.

0
codinghelp  05.02.2021, 11:37
@Steffi1997563

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

0

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....