Binärdarstellung zu Dezimaldarstellung

t.va4545

Mitglied
Hallo Liebes Forum,

ich bin neu hier und ein totaler Anfänger. Ich bringe mir aktuell Selbständig das Programmieren mit Java bei.
Als Übung habe ich mir selber die Aufgabe gestellt, die Bärdarstellung in die Dezimaldarstellung in Java rekursiv per Hand (Manuell) und ohne Math.pow (für die Potenz) oder scanner darzustellen.

Code:
public class Binaerdarstellung {


  public static int gibWertVonBinaer(long b){
  // hier muss der rekursive Code hin


}
    public static void main(String[] args) {
System.out.println(gibWertVonBinaer(1101));
       
    }

}

.........

Prinzipiell ist mir natürlich bewusst, wie ich Binärdarstellung in die Dezimaldarstellung umschreibe.
- mit b% 10 erhalte ich die letzte Zahl von b
- Wenn diese Zahl eine 1 ist muss ich diese Zahl dann mit 2^0 multiplizieren, wenn die Zahl eine null ist geben wir eine 0 aus.
- mit b/ 10 schneiden wir die letzte Zahl ab

und dann müsste mann erneut von vorne beginnen , jedoch mit der potenz die man um 1 erhöht hat.
zum schluss, wenn man alle Zahlen durchgegangen ist muss mann die ergebnisse zusammenrechnen.



wie kann ich dieses Verfahren rekursiv darstellen? ich habe Schwierigkeiten die Potenz darzustellen und diese nach jeder "runde" zu erhöhen. Zudem fällt es mir Schwer die ergebnisse zusammenzurechnen.




über eure Hilfe würde ich mich sehr freuen.



MfG
 
K

kneitzel

Gast
Der wichtige Punkt ist: Wenn du eine Reihe von Ziffern hast - mal mit Buchstaben dargestellt: abcdef, wie kannst Du den Wert denn dann mathematisch darstellen? Kannst Du da ein Formel Aufstellen a.la. Wert(abcdef) = Wert(abcde) mit irgend einer Operation + Wert(f)

Konkretes Beispiel: 111 = 11 ? ? + 1
Oder in dezimal dargestellt: 7 = 3 ? ? +1

Wenn Du eine Formel aufstellen kannst, dann kannst Du das als Rekursion darstellen:
Abbruchbedingung: nur eine Ziffer -> Ergebnis ist die Ziffer.

Sonst: letzte Ziffer + Rekursiver Aufruf übrige Ziffern mit irgend einer Operation.

Um auf die Operation zu kommen: Was für eine Operation ist denn dieses verschieben?
11 -> 110 : wie verändert sich der Wert, wenn ich das Komma sozusagen um eine Stelle verschiebe?
 

fhoffmann

Top Contributor
Deine Methodendeklaration sieht schon komisch aus:
Java:
int gibWertVonBinaer(long b)
Interessanter wäre vielleicht:
Java:
String gibDezimaldarstellungVonZahl(long b)
oder
Java:
String gibDezimaldarstellungVonBinaerdarstellung(String binaer)
 

handshake45

Bekanntes Mitglied
über eure Hilfe würde ich mich sehr freuen
Ignorier die Ratschläge einfach, an den Gegebenheiten musst du nichts ändern denn diese sind verständlich:
Java:
public class Rek {
	public static int gibWertVonBinaer(long b) {
		if (b == 0)
			return 0;
		return (int) (gibWertVonBinaer(b / 10) * 2 + b % 2);
	}

	public static void main(String[] args) {
		System.out.println(gibWertVonBinaer(110101));
		System.out.println(Integer.parseInt("110101", 2));
	}
}
 
K

kneitzel

Gast
Ignorier die Ratschläge einfach, an den Gegebenheiten musst du nichts ändern denn diese sind verständlich:

Also Hinweise zu Clean Code ignorieren ist schon ein super Ratschlag. Und warum musstest Du schon wieder ein neuen Account erstellen Tobias? Hab ich da schon wieder was verpasst?

Und schade, dass Du dem TE die Möglichkeit nimmst, anhand von Erläuterungen selbst auf die Lösung zu kommen....
 

handshake45

Bekanntes Mitglied
Ehm gegen clean code hab ich nix; aber wieso ratet ihr ihm, alle Methodennamen umzubenennen, wenn er eindeutig nach einer Hilfe gefragt hat?
 
K

kneitzel

Gast
Also erst einmal haben nicht wir ihm dazu geraten sondern @fhoffmann. Und das nachdem von mir allgemeine Hilfen bezüglich des Algorithmus geliefert wurden womit das lediglich eine Art Ergänzung ist ...

Und wenn du nichts gegen clean code hast: warum bist du dann gegen klarere Namen? Wieso nutzt du als Parameter nur b? Also wenn ich Code schreibe, dann mache ich es richtig und benennen direkt um. Aber das macht wohl die Jahrelange Erfahrung - da lebt man gewisse Grundlagen einfach...

Wieso soll er meine Hinweise zu dem Algorithmus ignorieren? Zumal deine Implementation ja nichts anderes macht? Das wäre sonst eine Frage, die ich in den Raum stellen würde ....

Aber nein, das müssen wir nicht weiter vertiefen, denn diesbezüglich haben wir ja schon genug Erfahrung aus der Vergangenheit....
 
K

kneitzel

Gast
Vor allem: Was für einen Sinn ergibt es, wenn gibWertVonBinaer(54) dann 2 ist?

Die Methode, die als Lösung so angeboten wurde, würde ich als dubios ansehen und mich fragen, was da wie ausgewertet wird. Verständlich wird es erst durch die Beschreibung der Funktionalität, was aufzeigt, dass der Code so als solches nicht die Informationen bereit hält, die benötigt werden.

Daher wäre meine Implementation etwas anders, was in etwa in diese Richtung ginge:
Java:
    public static int gibDezimaldarstellungVonBinaerdarstellung(long binaerZahl) {
        int firstDigit = binaerZahl % 10;
        if (firstDigit > 1) throw new IllegalArgumentException("Dual numbers can only contain 0 and 1 digits!");
        if (binaerZahl < 2) return binaerZahl;
        return (int) (gibDezimaldarstellungVonBinaerdarstellung(binaerZahl / 10) * 2 + firstDigit);
    }

Wobei ich hier auch String als Parameter verwenden würde, denn long ist einfach eine Zahl. Die Zahl hat erst einmal keine Darstellung. Die 15 ist erst einmal die 15. Wie ich diese nun darstelle ist ja ein ganz anderes Thema. Ich kann die Zahl im Dezimalsystem darstellen (15), hexadezimal (0xF) oder gerne auch binär: 1111. Aber das ändert ja nichts an der Zahl selbst. Wenn es um eine Darstellung geht, dann ist man nun einmal bei einem String (So es um die hier gewünschte Darstellung in Textform geht. Es gibt natürlich auch andere Darstellungsformen z.B. in Grafiken, Tönen, .... Das vernachlässige ich hier der Einfachheit aber.)
 

t.va4545

Mitglied
Ignorier die Ratschläge einfach, an den Gegebenheiten musst du nichts ändern denn diese sind verständlich:
Java:
public class Rek {
    public static int gibWertVonBinaer(long b) {
        if (b == 0)
            return 0;
        return (int) (gibWertVonBinaer(b / 10) * 2 + b % 2);
    }

    public static void main(String[] args) {
        System.out.println(gibWertVonBinaer(110101));
        System.out.println(Integer.parseInt("110101", 2));
    }
}

Danke schön erstmal an alle die mir hier geholfen haben...

dieser Beitrag von handshake45 hat mir wirklich sehr geholfen. In meinen Übungsunterlagen bin ich noch nicht soweit, dass ich die if befehle benutzen darf.

daher habe ich das mit den Bedingten Ausdrücken realisiert.

So sieht es aktuell aus:

Code:
public class Binaerdarstellung {


  public static int gibWertVonBinaer(long b){

        return (b == 0)
                ? 0
                : (int) (gibWertVonBinaer(b / 10) * 2 + b % 2);
    }
    public static void main(String[] args) {
System.out.println(gibWertVonBinaer(1111));
        
    }

}


es liefert korrekte Ergebnisse.

Ich habe hier trozdem eine weitere Verständnisfrage....

wie würde es aussehen, wenn man die Binärzahl 1111 "per Hand" auswerten würde? das habe ich noch nicht ganz Verstanden...

  • gibWertVonBinaer wird hier rekursiv aufgerufen. mit der Binärzahl von 1111 was Dezimal 15 ist.
  • es wird geschaut ob b(1111) ==0 ist (ist es nicht)
  • also springt man zu dem (int) (gibWertVonBinaer(b/10) *2+b%2) befehl. (die zahl 1111 wird mit 10 dividiert, anschließend mit 2 multipliziert und mit dem rest von 1111%2 addiert)
  • dann schaut man ob der neue wert == 0 ist
  • wenn nicht geht man wieder vor wie oben.
so weit mein Verständnis.
Wenn ich das jedoch so ausführe komm ich zu einemanderen Ergebnis als 15.

kann mir hier einer vielleicht detailiert darstellen, wie das "per Hand" ausgewertet werden würde?


das würde mich wirklich sehr helfen.


MfG
 
K

kneitzel

Gast
Die Wertigkeit der Stellen ist (von rechts nach links):
2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
...

Somit hast du 1 + 2 + 4 + 8 = 15
 

handshake45

Bekanntes Mitglied
Auf dem Papier würde ich das vielleicht so rechnen:
Java:
	public static void main(String[] args) {
		String s = "010111";
		int wertigkeit = 1;
		long summe = 0;
		for (int i = s.length() - 1; i >= 0; i--) {
			if (s.charAt(i) == '1') {
				summe += wertigkeit;
			}
			wertigkeit *= 2;
		}
		System.out.println(summe);
		System.out.println(Integer.parseInt("010111", 2));
	}

Obwohl das 1. Semester bei mir schon etwas her ist...
 
K

kneitzel

Gast
Doch. Genau das. Bei dem ersten bit hast du 0 mal das "* 2"
Wenn Du dann aber die nächste Stelle nimmst, hast du 1 mal das "*2"
Dann hast Du das *2 drei mal.
...
Also genau diese Potenzen.
 

Ähnliche Java Themen

Neue Themen


Oben