studyklar
GdI 1 · Übungsblatt 6 · Aufgabe 3

Dezimal in dual mit der Divisionsmethode: do-while und for

Wie wird aus 13 die Dualzahl 1101? Mit der Divisionsmethode aus Kapitel 1: immer wieder durch 2 teilen, die Reste sind die Ziffern. Das Programm macht genau das in einer Schleife und gibt jeden Rest sofort aus, die niedrigste Ziffer zuerst. Rechts stehen die Divisionsmethode für 13 und das Programm, die Teile zum aktuellen Schritt sind hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 6.3

a) Schreiben Sie ein Java-Programm A6_3a, welches eine einzulesende natürliche Zahl einschließlich 0 von der Dezimaldarstellung in die Dualdarstellung umwandelt. Die Stellenzahl richtet sich nach der Größe der eingegebenen Zahl. Orientieren Sie sich an der Divisionsmethode aus Kapitel 1.

Hinweis: Die Divisionsmethode ermittelt die einzelnen Ziffern der Dualzahl von rechts nach links. Das Programm soll sie zeilenweise ausgeben, die niedrigstwertige zuerst.

Beispiel: Eingabe13
Ausgabe1← LSB
0
1
1← MSB

b) Kopieren Sie Ihr Programm A6_3a (neuer Name A6_3b). Ändern Sie das neue Programm so ab, dass die Dualzahl immer mit 10 Stellen ausgegeben wird, d. h. ggf. sind führende Nullen zu ergänzen.

In a) liest das Programm eine Zahl x ab 0 und gibt ihre Dualziffern untereinander aus, zuerst die niedrigstwertige, also die ganz rechts (englisch LSB, least significant bit). Zuletzt kommt die höchstwertige ganz links (MSB, most significant bit). Es gibt so viele Zeilen, wie die Zahl Stellen braucht. In b) sind es immer 10 Zeilen; fehlende Stellen vorn werden mit Nullen aufgefüllt.

Merke: x % 2 ist die nächste Dualziffer (der Rest), x / 2 ist die Zahl für die nächste Zeile (der Quotient). In der Vorlesung heißen sie x mod 2 und x div 2.
  1. a) Die Divisionsmethode für 13 von Hand.
  2. a) Klären, in welcher Reihenfolge die Ziffern kommen.
  3. a) Eine Zeile der Tabelle als Java.
  4. a) Die passende Schleife: do-while.
  5. a) x einlesen.
  6. a) Testen mit 13, 0 und 72.
  7. b) Warum die Nullen von selbst kommen.
  8. b) Genau 10 Runden mit for.
  9. b) Ergänzung: Zahlen über 1023 abfangen.
  10. b) Testen.

Die Divisionsmethode für 13

Probe: Stellenwerte 8, 4, 2, 1
11012=1⋅8+1⋅4+0⋅2+1⋅1=131101_2 = 1 \cdot 8 + 1 \cdot 4 + 0 \cdot 2 + 1 \cdot 1 = 13

13 geteilt durch 2 ist 6, Rest 1. Dann 6 durch 2: 3, Rest 0. Dann 3 durch 2: 1, Rest 1. Dann 1 durch 2: 0, Rest 1. Der Quotient ist 0, Schluss. Von unten nach oben gelesen ergeben die Reste 1101.

Aus Skript 1a („Divisionsmethode“): Jede Zeile notiert x, x div 2 (der ganzzahlige Quotient) und x mod 2 (der Rest). Die nächste Zeile beginnt mit dem Quotienten. Abbruch, sobald der Quotient 0 ist. Die Reste sind die Ziffern z₀, z₁, z₂, …, von rechts nach links.
Aus Blatt 1, Aufgabe 1 („Lichtorgel, Basis 14 und Umrechnen zwischen dual, oktal, hex“): Dort wurde mit der Divisionsmethode von Hand umgerechnet, etwa 666 zur Basis 16: teilen durch die Basis, die Reste von unten nach oben lesen.

Die Reste kommen schon in der verlangten Reihenfolge

ZeileRestZifferAusgabe
11z₀ (LSB)zuerst
20z₁als zweite
31z₂als dritte
41z₃ (MSB)zuletzt

Von Hand liest man die Reste von unten nach oben, um die Zahl von links nach rechts zu schreiben. Das Programm soll aber die niedrigstwertige Ziffer zuerst ausgeben. Das ist der erste Rest, der entsteht: 1, dann 0, 1, 1. Die Reste kommen also genau in der Reihenfolge, in der sie ausgegeben werden sollen. Das Programm kann jeden Rest sofort ausgeben und muss sich keinen merken.

Noch 9 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Abbildung 1a) So viele Stellen wie nötig

Divisionsmethode mit do-while

xx div 2x mod 2Leserichtung
1361
630
311
101

Reste von unten nach oben lesen:1310 = 11012

public class A6_3a {     public static void main(String[] args) {        Out.print("x = ");        int x = In.readInt();         do {            Out.println(x % 2);            x = x / 2;        } while (x > 0);    }}
LegendeOben die Divisionsmethode für 13, unten nur das Gerüst von A6_3a.