Skip to main content

So kannst du in Java eine Binärzahl in eine Dezimalzahl umwandeln


java programmierung binärzahl in dezimalzahl umwandeln

Erinnerst du dich?
In einer der letzten Beiträge haben wir uns die Zusammenhänge zwischen dem dualen und dem dezimalen Zahlensystem angeschaut.
Aber wir haben noch keine Java Binärzahl in eine Dezimalzahl verwandelt.
Zumindestens nicht praktisch….

Stattdessen….
Haben wir festgestellt, dass beide Zahlensysteme im Grunde genommen sehr ähnlich sind.
Beim Dezimalsystem spielt die Zahl 10, als Faktor eine zentrale Rolle.
Und beim dualen System ist es stattdessen der Faktor zwei.

In diesem Beitrag möchte ich mit dir ein kleines Java Programm erstellen.
Und dieses Programm bzw. die Methode des Java Programmes soll binären Zahlen in Dezimalzahlen umwandeln

Wiederholen wir ganz kurz die Grundlagen.

Welche Dezimalzahl verbirgt sich hinter der Dualzahl 110101101?

Java-Binäre-Zahl

Okay – Wie fängst du jetzt an?
Als Erstes nimmst du jede Ziffer der Zahl und multiplizierst diese mit 2.

Wieso mit Zwei?
Erinnere dich bitte.
Im Dualsystem ist der Faktor (Basis) die Zwei und im Dezimalsystem wäre es die Zehn.

Aber du multiplizierst nicht nur.
Je nach Stelle der entsprechenden Zahl musst du diese auch noch Potenzieren.
Dieser Zusammenhang zwischen Multiplizieren und Potenzieren ist genauso – wie im Dezimalsystem.

Java-Binäre-Zahl-umwandeln

So geschafft.
Als Nächstes müssen die Potenzen ermittelt werden.
java-binäre-zahl-potenzen

Dann kannst du die einzelnen Terme ausmultiplizieren.
Java-Binärzahlen-umwandeln-Summen

Und letztlich summierst du die entstandenen Produkte.
Java-Binärzahl-umwandeln-Iterationen

Die Dualzahl 110101101 entspricht somit der Dezimalzahl 429.

So jetzt endlich kommen wir zum Java Code.

Die Methode soll die binäre Zahl in eine Dezimalzahl umwandeln.

Eben genauso, wie wir dies gerade mathematisch vollzogen haben.

Also habe ich eine neue Java Klasse, mit dem originellen Namen „JavaDualzahl“, angelegt.

public class JavaDualzahl {

}

Und aus dieser Klasse heraus, soll das Programm gestartet werden können.
Also braucht die Klasse auch eine main-Methode.

public class JavaDualzahl {

	public static void main(String[] args) {
		

	}
}

Und natürlich die Java Methode zur Umwandlung der binären Zahl in eine Dezimalzahl.
Auch hier war ich kreativ und vergab den Namen „wandleBinInDez()“.

public class JavaDualzahl {
	
	static void wandleBinInDez(){
		
	}

	public static void main(String[] args) {

	}
}

Die Methode ist statisch, denn ich möchte nicht erst Objekte erstellen müssen – nur um diese aufzurufen.

public class JavaDualzahl {
	
	static void wandleBinInDez(){
		
	}

	public static void main(String[] args) {
		wandleBinInDez();//Statische Methode kann ohne Objekt aufgerufen werden
	}
}

Versehen wir die Methode noch mit etwas Schnickschnack.

Und zwar hat die Methode keine Parameterliste.
Du kannst ihr also beim Aufruf, keine Zahl übergeben.

Das ist so gewollt.
Denn diese Methode soll alle möglichen binären Zahlen entgegen nehmen können.
Dadurch bleibt das Programm schön flexibel.
Somit benötigst du noch eine Programmstruktur, welche dies ermöglicht.

Also wie schaffen wir nun so eine Struktur?
Klar mit einer Bildschirmeingabe.
Stichwort – Scanner.

import java.util.Scanner;//Importanweisung für den Scanner

public class JavaDualzahl {
	
	static void wandleBinInDez(){
		Scanner eingabe = new Scanner(System.in);//Scanner zur Speicherung der Eingabe
		System.out.println("Bitte gib eine Dualzahl ein!");//Aufforderung zur Eingabe
		
		int binZahl = eingabe.nextInt();//Eingabe wird gespeichert
	}

	public static void main(String[] args) {
		wandleBinInDez();//Statische Methode kann ohne Objekt aufgerufen werden
	}
}

Die Integer-Variable „binZahl“ speichert jetzt deine eingegebene binäre Zahl.

Jetzt kümmern wir uns um die Umwandlung der Binärzahl in eine Dezimalzahl.

Ich lege eins der Bilder nochmal rein.

java-binäre-zahl-potenzen

Du siehst die Potenzen – hoch 8 bis hoch 0?
Jetzt musst du als Erstes der Methode beibringen, wie sie diese Potenzen ermittelt.

Also – wie machst du das?
Ganz einfach – durch Kommaverschiebung.
Erinnerst du dich – Wenn man eine x-beliebige Zahl durch 10 dividiert, verschiebt sich das Komma nach links.

  • 50 geteilt durch 10 ist 5,0 – Kommaverschiebung nach links.
  • 110101101 geteilt durch 10 ist 11010110,1 – Wieder eine Verschiebung nach links.

Wenn man durch 10 hoch 2 dividiert, hat man zwei Kommaverschiebungen.

  • 50 geteilt durch 10² (100) ist dann 0,5.
  • Und 110101101 geteilt durch 10² ist 1101011,01.

Hier nochmal das Bild.

Java-Binäre-Zahl

Wie oft kannst du das Komma bei dieser binären Zahl nach links verschieben?
Na hast du gezählt?
Wie oft kannst du nach links verschieben und die Zahl ist dann immer noch größer Null?
Genau achtmal.

Wir brauchen also eine Schleife, welche das Komma 8 mal nach links verschiebt.

Erinnerst du dich?
Wir wollten jede x-beliebige Zahl eingeben können.
Und deshalb weiß die Methode natürlich nicht, wie oft sie das Komma verschieben soll.

Stattdessen können wir sagen:

„Liebe Java Methode,
Verschiebe so oft wie möglich das Komma nach links.
Eben solange, bis du nicht mehr weiterkommst.
Bei jedem Schleifendurchlauf prüfe bitte, ob du das Komma nochmal verschieben kannst.“

Da im Vorfeld nicht klar ist, wie oft das Komma verschoben wird – ist auch die Anzahl der Schleifendurchläufe unbekannt.
Und immer dann, wenn die Anzahl der Durchläufe unbekannt ist – brauchst du eine While-Schleife.
Die Schleifenbedingung sieht dann so aus:

import java.util.Scanner;//Importanweisung für den Scanner
public class JavaDualzahl {
	
	static void wandleBinInDez(){
		Scanner eingabe = new Scanner(System.in);//Scanner zur Speicherung der Eingabe
		System.out.println("Bitte gib eine Dualzahl ein!");//Aufforderung zur Eingabe
		
		int binZahl = eingabe.nextInt();//Eingabe wird gespeichert
		
		while (binZahl !=0){
			/*
			 * Schleifenrumpf wird nur solange ausgeführt - solange die Zahl nicht Null ist
			 */
	}

	public static void main(String[] args) {
		wandleBinInDez();//Statische Methode kann ohne Objekt aufgerufen werden
	}
}

Und diese Bedingung lässt die Schleife jetzt solange durchlaufen, bis die Zahl Null ist.
Solange die eingegebene Zahl eben nicht Null ist, läuft die Schleife immer weiter.

Also kümmern wir uns um den Schleifenrumpf.
Schließlich muss hier die eingegebene Zahl irgendwann einmal Null werden.

Also dann….

Im Schleifenrumpf wird das Komma nach links verschoben, bis die Zahl auch wirklich „Null“ ist.

Und so eine „So-lange-wie-möglich-Kommaverschiebung“ machst du mit dem Modulo Operator.
Hier nochmal das Bild:

Java-Binäre-Zahl

Die Schleife würde als Erstes prüfen, ob die übergebene Zahl „Null“ ist.
Die Antwort lautet:

„Nein ist nicht „Null“.

Also Komma einmal nach links.

  • 110101101 = 110101101 / 10 = 11010110 und Rest 1
  • Wieso Rest 1?
    Denn wenn du das Ergebnis 11010110 wieder mit 10 multiplizierst, erhältst du 110101100.
  • Und die Differenz zwischen dem Ausgangswert 110101101 und dem Ergebnis 110101100 ist 1.
    110101101 – 110101100 = 1

Dann würde die nächste Verschiebung so aussehen:

  • 110101101 / 10 = 11010110 und Rest 1
  • Denn 11010110 *10 = 110101100
  • Und 110101101 – 110101100 = 1

Und noch eine:

  • 11010110 / 10 = 1101011 Rest 0
  • Denn 1101011 * 10 = 11010110
  • 11010110 – 11010110 = 0

Das Prinzip ist klar, oder?
Dies soll die Schleife jetzt für jede Ziffer der Dualzahl machen.

Wichtig ist….
Der Restwert bei einer Division durch 10, würde somit immer der letzten Stelle der kompletten Zahl entsprechen.
Somit musst du dir den Restwert erst einmal in einer Variable speichern.
Und dann den Restwert im Schleifenrumpf ermitteln lassen.

import java.util.Scanner;

public class JavaDualzahl {
	
	static void wandleBinInDez(){
		Scanner eingabe = new Scanner(System.in);
		System.out.println("Bitte gib eine Dualzahl ein!");
		
		int binZahl = eingabe.nextInt();
		int restWert=0;//Restwert als Zwischenergebnis
		
		while (binZahl !=0){
			restWert=binZahl % 10;//Restwert nach Kommaverschiebung aus letzten Durchlauf	
			binZahl=binZahl / 10;//neue Kommaverschiebung
		}
	}

	public static void main(String[] args) {
		wandleBinInDez();//Methodenaufruf
	}
}

Was du jetzt noch brauchst ist…
Die Anzahl der Verschiebungen.
Also lege auch dafür eine Variable an und erhöhe diese im Rumpf um jeweils eins.

import java.util.Scanner;

public class JavaDualzahl {
	
	static void wandleBinInDez(){
		Scanner eingabe = new Scanner(System.in);
		System.out.println("Bitte gib eine Dualzahl ein!");
		
		int binZahl = eingabe.nextInt();
		int anzahlVerschiebung=0;//Anzahl der Stellen mit Startwert 0
		int restWert=0;
		
		while (binZahl !=0){
			restWert=binZahl%10;//Restwert nach Kommaverschiebung aus letzten Durchlauf
			binZahl=binZahl/10;//neue Kommaverschiebung
			anzahlVerschiebung=anzahlVerschiebung+1;//Anzahl der Stellen wird je Durchlauf um 1 erhöht
		}
	}

	public static void main(String[] args) {
		wandleBinInDez();//Methodenaufruf
	}
}

Schau mal auf den Schleifenrumpf und vergleiche mal mit der Gleichung.

Java-Binärzahl-umwandeln-Algorithmus

Nehmen wir einmal nur den letzten Ausdruck der Gleichung.
Schließlich fängt die Schleife auch hinten an.

  • restwert 1 = Der Restwert, welcher durch Division mit 10 entsteht.
    Dieser entspricht immer der letzten Ziffer der Binärzahl.
    (Division 10 = letzte Zahl, Division 100 = vorletzte Zahl, usw….)
    Da die Division bei jedem Durchlauf stattfindet, wird jedes Mal eine neue Zahl abgeschnitten.
  • Basis 2 = Das ist die Basis, da es sich um eine Binärzahl handelt.
  • anzahlVerschiebungen 0 = diese Variable wird ebenfalls bei jedem Durchlauf erhöht.
    Sie beginnt beim Startwert Null und steigt um jeweils 1 an.

So die Variablen haben wir.
Was noch fehlt ist – die Verrechnung.

Du benötigst eine Rechenoperation, welche die Potenzen ermittelt.

Und zwar die Potenz aus den jeweiligen Schleifendurchläufe (anzahlVerschiebungen) zur Basis 2.

Du könntest jetzt mit einer selbst gebastelten for-Schleife die Potenzen bestimmen lassen.

Oder du nutzt eine vorgefertigte Methode:
Denn die Java Klasse Math bietet dir, mit der pow-Methode() so eine Potenz-Methode an.

Die Rückgabe speicherst du in einer neuen Variablen, namens „dezZahl“.
Diese Variable ist deine umgewandelte Dezimalzahl und somit auch das finale Ergebnis des ganzen Programmes.

import java.util.Scanner;

public class JavaDualzahl {
	
	static void wandleBinInDez(){
		Scanner eingabe = new Scanner(System.in);
		System.out.println("Bitte gib eine Dualzahl ein!");
		
		int binZahl = eingabe.nextInt();
		int anzahlVerschiebung=0;
		int dezZahl=0;//Dezimalzahl welche ermittelt wird
		int restWert=0;
		
		while (binZahl !=0){
			restWert=binZahl%10;//Restwert nach Kommaverschiebung aus letzten Durchlauf
			dezZahl = (restWert*(Math.pow(2, anzahlVerschiebung)));//Zwischenwerte	
			binZahl=binZahl/10;//neue Kommaverschiebung
			anzahlVerschiebung=anzahlVerschiebung+1;//Anzahl der Stellen wird je Durchlauf um 1 erhöht
		}
	}

	public static void main(String[] args) {
		wandleBinInDez();
	}
}

Was du beachten solltest:
Der Rückgabewert der pow-Methode ist ein double-Wert.
Unsere Variable „dezZahl“, welche den Wert speichern soll – ist ein Integer.
Du musst also den Rückgabewert explicit in einen Integer-Datentyp umwandeln bzw. casten.


import java.util.Scanner;

public class JavaDualzahl {
	
	static void wandleBinInDez(){
		Scanner eingabe = new Scanner(System.in);
		System.out.println("Bitte gib eine Dualzahl ein!");
		
		int binZahl = eingabe.nextInt();
		int anzahlVerschiebung=0;
		int dezZahl=0;
		int restWert=0;
		
		while (binZahl !=0){
			restWert=binZahl%10;
			dezZahl = (int)(restWert*(Math.pow(2, anzahlVerschiebung)));//Casting Zwischenwerte	
			binZahl=binZahl/10;
			anzahlVerschiebung=anzahlVerschiebung+1;
		}
	}

	public static void main(String[] args) {
		wandleBinInDez();
	}
}

So fast fertig.

Jetzt muss nur noch die Summe aus allen Zwischenergebnissen ermittelt werden.

Java-Binärzahl-umwandeln-Iterationen

Wie geht das?
Lass im Schleifenrumpf immer wieder das bisherigere Ergebnis, welches bereits in der Variablen „dezZahl“ gespeichert ist, mit der Rückgabe der Methode addieren.

import java.util.Scanner;//Importanweisung für den Scanner

public class JavaDualzahl {
	
	static void wandleBinInDez(){
		Scanner eingabe = new Scanner(System.in);//Scanner zur Speicherung der Eingabe
		System.out.println("Bitte gib eine Dualzahl ein!");//Aufforderung zur Eingabe
		
		int binZahl = eingabe.nextInt();//Eingabe der binären Zahl wird gespeichert
		int anzahlVerschiebung=0;//Anzahl der Stellen mit Startwert 0
		int dezZahl=0;//Dezimalzahl welche ermittelt wird
		int restWert=0;//Restwert als Zwischenergebnis
		
		while (binZahl !=0){
			restWert=binZahl % 10;//Restwert nach Kommaverschiebung aus letzten Durchlauf
			dezZahl = dezZahl+(int)(restWert*(Math.pow(2, anzahlVerschiebung)));//Summierte Zwischenwerte	
			binZahl=binZahl / 10;//neue Kommaverschiebung
			anzahlVerschiebung=anzahlVerschiebung+1;//Anzahl der Stellen wird je Durchlauf um 1 erhöht
		}
		System.out.println(dezZahl);//Ausgabe der Dezimalzahl
	}

	public static void main(String[] args) {
		wandleBinInDez();//Statische Methode kann ohne Objekt aufgerufen werden
	}
}

Hier nochmal das Bild und der Vergleich zum Java Code im Schleifenrumpf.

Java-Binäre-Zahl-Umwandeln-Schritt-für-Schritt

Das war’s -Fertig!
Probiere es einfach mal aus.
Schmeiß das Teil an und übergib die Zahl: 110101101 .
Das Ergebnis sollte 429 sein.

Zusammenfassung:

  • Eine Binärzahl ist eine Zahl, welche aus der Kombination von zwei Zahlen besteht.
    In den meisten Fällen ist es Null und Eins.
  • Um eine Binärzahl in eine Dezimalzahl umzuwandeln, musst du diese zunächst in „2-er-Basen“ aufsplitten.
    Dazu bietet sich immer eine Schleife an.
  • Aufgrund dessen, dass die Länge bzw. die Stellen der Zahl unbekannt ist – ist auch die Anzahl der Schleifendurchläufe unbekannt.
    Deshalb solltest du eine While Schleife verwenden.
  • Im Schleifenrumpf wird jeweils der Exponent erhöht, die Zahl um eine Stelle gekürzt und die Summe aus allen Potenzen/Produkten berechnet.

Ähnliche Beiträge

So sorgt Java Polymorphie für besseren Code und mehr Möglichkeiten

java programmierung polymorphie code möglichkeiten

Polymorphie ist das Herzstück jeder objektorientierten Sprache. Nicht nur in Java – auch in Python, Javascript und in anderen Sprachen. Aber was bedeutet Polymorphie eigentlich? Polymorphie oder auch Polymorphismus genannt, kommt aus dem Griechischen. Es bedeutet Vielgestaltigkeit. Etwas freier übersetzt, kannst du es auch als Facettenreichtum bezeichnen. Im Grunde genommen […]

Zwei smarte Möglichkeiten eine Java Zufallszahl zu erzeugen

java zufallszahl anlegen erzeugen

Java Zufallszahl – Wieso? In der Java Programmierung benötigst du immer wieder einmal Zufallszahlen. Du möchtest deine Software mit Daten testen und dir keine Zahlen ausdenken. Du benötigst Stichproben, welche ein reales Verhalten simulieren. Du hast ein Spiel entworfen und die Akteure sollen mit zufälligen aber unterschiedlichen Größen, Rüstungsleveln usw. […]

Lokale Variablen im Java Programm: Lebensdauer und Nutzung

lokale variablen im java programm

Lass uns über die Lebensdauer einer lokalen Variablen sprechen. Warum ausgerechnet die Lebensdauer? Alle Java Variablen, unterscheiden sich in folgenden Punkten: wo diese deklariert werden können, wie du diese aufrufen kannst, welchen Bereich diese abdecken, und Ihre Lebensdauer Und eine lokale Java Variable hat eine relativ kurze Lebensdauer. Schauen wir […]

So kannst du Konstanten in Java Programmen anlegen und nutzen

java programmierung konstanten anlegen und nutzen

Java Konstanten – was kann man sich darunter vorstellen? Du kennst Konstanten in der Mathematik. Die Kreiszahl Pi ist so eine konstante Zahl. Diese Zahl ändert sich niemals. Sie beträgt immer rund 3,141592. In der Physik gelten die Lichtgeschwindigkeit, der Erdradius oder der absolute Nullpunkt als konstant. Selbst die Geschwindigkeit […]

Java Anfänger Übung: Hello World

Java-Übung-Hello-World

Alles beginnt mit „Hello World“. Sämtliche Java Bücher beginnen mit diesem ersten Beispiel. Auch die Java Übungen sollen mit diesem ersten Programm starten. Definiere eine Klasse „Hello World“. Implementiere die Main Methode. Die Main Methode soll bei Programmaufruf die Bildschirmanzeige „Hallo Welt“ zurückgeben. Die Lösung zur Java Übung „Hallo Welt“ […]

Java Konsolenausgaben mit formatierten Zahlen

java programmierung konsolenausgabe mit formatierten zahlen

Java Konsolenausgaben erzeugst du mit der System.out.println()-Anweisung. Dies ist relativ einfach. Aber es ist mitunter nicht ganz praktisch. Und zwar immer dann, wenn Zahlen im Spiel sind. Die Zahlen welche dann auf deiner Java Konsole erscheinen, sind unformatiert. Sie haben zu viele Kommastellen. Oder für eine bessere Darstellung benötigst du […]

Die 5 verschiedenen Zahlensysteme in der Java Programmierung

java programmierung zahlensysteme

Java Zahlensysteme – Was soll das? In sämtlichen Programmiersprachen werden Zahlen in Variablen abgespeichert. Wenn du dir die einzelnen primitiven Datentypen in Java einmal anschaust – wirst du feststellen – dass die Masse der Datentypen Zahlen annehmen und speichern können. Zahlen und die Mathematik dahinter spielen in der Programmierung eine […]

So solltest du Kommentare im Java Programm einsetzen

java programmierung kommentare

Bei der Java Programmierung sind Kommentare mitunter genauso wichtig wie der eigentliche Code. Denn ein guter Kommentar zeigt dir sofort, was mit dem Code gemeint ist, was dieser bewirkt und was sich der Entwickler dabei dachte. Wie werden Kommentare in Java gesetzt? Die Kommentare werden in Eclipse immer grün dargestellt. […]

So funktioniert der Java Programmstart mit Argumenten-Übergabe

java programmierung programmstart argumente

Um ein Java Programm starten zu können, benötigst du immer die main-Methode. Das Programm startet immer genau an dieser Stelle. Alle lokalen Variablen, welche du in der Main Methode anlegst, kannst du dann im Programm nutzen. Auch alle Methoden, welche du innerhalb des Methodenrumpfes der main-Methode aufrust, werden ausgeführt. Was […]

So kannst du spielend Java Programmierung lernen

java programmierung lernen

Ich lernte die Java Programmierung auf die klassische Art. Ich kaufte mir das erste Buch und los ging es. „Jetzt wirst du Java lernen“ – sagte ich zu mir. Ich war relativ schnell ziemlich frustriert, denn irgendwie fehlten mir ein paar Zusammenhänge. Kennst du das? Du hast ein Wissensfetzen und […]

So funktioniert die Java Konsoleneingabe über den Scanner

java programmierung konsoleneingabe scanner

Es wird Zeit für die erste Java Konsoleneingabe. Und diese Eingaben machst du über den Java Scanner. Was ist das? Der Scanner ist eine vorgefertigte Java Klasse, welche Java mit seiner API anbietet. Das heißt du musst nichts selbst erschaffen. Du musst nur wissen, wie du darauf zugreifst. Erst einmal […]

So kannst du Java installieren

java-installieren

Bevor du loslegst und deine ersten Java Programme schreibst, benötigst du die entsprechende Arbeitsumgebung. Du solltest also Java installieren. Und diese Arbeitsumgebung beinhaltet dann Bibliotheken für die einzelnen Java-Standard-Klassen, Dateien um deine Programme auszuführen. Dateien um deine Programme zu packen, Logische Verzeichnisstrukturen

Syntax, Semantik und Lexikalik in der Java Programmierung

java programmierung lexikalik syntax semantik

Java ist eine Programmiersprache. Und wie jede andere Programmiersprache ist auch Java, lediglich eine künstliche Sprache.   Normalerweise bieten künstliche Projekte immer jede Menge Spielraum für Eigenkreationen. Bei der Programmierung ist dies nicht ganz so. Denn Programmiersprachen sind auch immer sehr exakt.   Jede Programmiersprache und auch jede gesprochene Sprache […]

Namenskonventionen bei der Java Programmierung

java-programmierung-namenskonvention-lowercasecamelcase

Beiderjavaprogrammierungsolltestduaufdierichtigenamensvergabeachten. indennnamengebendeinenjavaprogrammeinegrundlegendestruktur. Was sagen dir die beiden oberen Sätze? Häh? Da steht: Bei der Java Programmierung solltest du auf die richtige Namensvergabe achten. Denn Namen geben deinem Java Programm eine grundlegende Struktur. Jede Sprache braucht Regeln. Diese Regeln, wie Grammatik oder Rechtschreibung geben der Sprache eine Struktur. Jeder Leser, welcher […]

Unterschied zwischen Klassenvariable und Instanzvariable im Java Programm

unterschied klassenvariable instanzvariable java programmierung

Bei der Java Programmierung unterscheidet man drei Arten von Variablen. Als erste Gruppe sind die lokalen Variablen zu nennen. Auf diese gehe ich in einem separaten Artikel ein. Mich interessieren die zwei anderen Variablentypen. Zum einen existieren Klassenvariablen. Und dann sind da noch die Instanzvariablen. Wo liegt der Unterschied zwischen […]