• Keine Ergebnisse gefunden

2.1 Back to Basics I: Bits and Bobs 6 Punkte

N/A
N/A
Protected

Academic year: 2022

Aktie "2.1 Back to Basics I: Bits and Bobs 6 Punkte"

Copied!
2
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Praktische Informatik 3 WS 12/13

2. Übungsblatt

Ausgabe: 31.10.12 Abgabe: 09.11.12

Christoph Lüth Marcus Ermler Christian Maeder Martin Ring Diedrich Wolter

In dieser Aufgabe wollen wir die Grundlagen der binären Arithmetik in Haskell implementieren.

2.1 Back to Basics I: Bits and Bobs 6 Punkte

Zuerst benötigen wir einen DatentypBit, der aus zwei disjunkten Werte besteht, mit zwei Funktionen dec1 :: Bit→ I n t

enc1 :: I n t→ Bit

die ein einzelnes Bit in eine ganze Zahli∈ {0, 1}verwandeln.

Ein Bitliste ist eine Sequenz einzelner Bits, und ist entweder leer, oder besteht aus einem Bit, vorne an eine Bitliste angehängt.

Implementieren Sie den DatentypBitlist, und drei Funktionen encode :: I n t→ B i t l i s t

decode :: B i t l i s t→ I n t display :: B i t l i s t→ String

welche eine ganze Zahl in eine Bitliste kodieren, eine Bitliste in eine ganze Zahl dekodieren, sowie eine Bitliste als Binärzahl anzeigen. Beispiel:

*> display (encode 1238923)

"1OO1O111OO1111OOO1O11"

2.2 Back to Basics II: It all adds up! 7 Punkte

Jetzt wollen wir mit Bitlisten rechnen. Dazu benötigen wir zuerst grundlegenden boolschen Operatoren. Imple- mentieren Sie dazu Funktionen

band, bor , bxor :: Bit→ Bit→ Bit

welche Konjunktion, Disjunktion und ausschließende Disjunktion auf einzelnen Bits implementieren.

A B

Cin S

Cout XOR

XOR

OR AND AND

Quelle:http://en.wikipedia.org/wiki/Adder_(electronics)

Abbildung 1: Ein Volladdierer Um die Addition zweier als Bitlisten repräsentierter Zahlen zu rea-

liseren, konstruieren wir zuerst einen Volladdierer (full adder), der drei Bits (zwei Argumente und einen Übertrag) zu zwei Bits (ei- nem Ergebnis und ein Übertrag) addiert. Wir implementieren den Volladdierer durch zwei Funktionen, welche die beiden Ausgänge S(Summe) undC(Übertrag) darstellen:

fullAdderS :: Bit→ Bit→ Bit→ Bit fullAdderC :: Bit→ Bit→ Bit→ Bit

Ein Schaltbild eines Volladdiererers, aus dem sich die Definition der Funktionen ablesen läßt, findet sich in Abb. 1.

Um zwei durch Bitlisten repräsentierte Binärzahlen zu addieren, werden rekursiv die jeweiligen Bits mit dem Übertrag der letzten Addition in einem Volladdierer addiert. Wenn beide Bitlisten leer sind, muss ein eventuell noch ausstehender Übertrag vorne angehängt werden. Wir gehen von keinen festen Wortlängen (Länge der Bitlisten) aus!Eine Möglichkeit wäre es, die zu addierenden Bitlisten durch vorne angefügte0Bits auf die gleiche Länge zu bringen, um in der rekursiven Definition von gleich langen Bitlisten ausgehen zu können.

1

(2)

Revision 1832 vom 2012-10-31

2.3 Back to Basics III: Many Times 7 Punkte

Mithilfe der Addition können wir multiplizieren. Die Multiplikation geht von der Beobachtung aus, dass Verdoppe- lung und Halbierung durch einfaches Hinzufügen eine0als LSB1resp. Entfernen des LSB implementiert werden kann (shift leftundshift right). Ferner können wir die Multiplikation rekursiv wie folgt formulieren:

0·b = 0 (1)

(2·a)·b = 2·(a·b) (2)

(2·a+1)·b = 2·(a·b) +b (3) Wenn wir Gleichungen (2) und (3) etwas umformulieren, erhalten wir eine rekursive Definition (wobeix÷ydie ganzzahlige Division ist):

a·b=

2·((a÷2)·b) füragerade 2·((a÷2)·b) +b füraungerade Implementieren Sie damit eine Funktion

mult :: B i t l i s t→ B i t l i s t→ B i t l i s t

welche rekursiv durch Shift-Operationen und Addition die Multiplikation zweier durch Bitlisten repräsentierter Binärzahlen implementiert. Auch hier können Sie nicht von einer festen Wortlänge ausgehen.

? Verständnisfragen

1. Welche zusätzliche Mächtigkeit wird durch Rekursion bei algebraischen Datentypen in der Modellierung erreicht? Was läßt sich mit rekursiven Datentypen modellieren, was sich nicht durch nicht-rekursive Daten- typen erreichen läßt?

2. Was ist der Unterschied zwischen Bäumen und Graphen, in Haskell modelliert?

3. Was sind die wesentlichen Gemeinsamkeiten, und was sind die wesentlichen Unterschiede zwischen alge- braischen Datentypen in Haskell, und Objekten in Java?

1Das LSB (least significant bit) ist das geringstwertige Bit, also die letzte binäre Ziffer.

2

Referenzen

ÄHNLICHE DOKUMENTE

The challenges of modern times do not stop at the ceramics and refrac- tory industry: Refractory linings in kilns should improve the energy foot- print, their components should be as

recht gut lesbar, nahezu selbst-dokumentierend, aber Speicher-aufwändig ( die Ziffernfolge „12345678“ benötigt 8 Bytes, die dargestellte Zahl aber nur 3

recht gut lesbar, nahezu selbst-dokumentierend, aber Speicher-aufwändig ( die Ziffernfolge „12345678“ benötigt 8 Bytes, die dargestellte Zahl aber nur 3

“the importance of the support of local communities, private sector, civil society and media for increasing awareness about the threats of terrorism and more effectively

Every stakeholder was looking for a different outcome: the ITU wished to expand its remit over the Internet, European Telecom operators wanted to secure more revenues by

Bei solchen Untersuchungen wurde bereits festgestellt, dass nach einer relativ kurzen Einarbeitungszeit in den neuen Programmierstil zwar der Gesamt- aufwand

Es sei t p der Propagation‐Delay und t f die  Transmission‐Time für einen Frame. Die  Gesamtzeit T für n Frames ist:.

Es sei t p der Propagation‐Delay und t f die  Transmission‐Time für einen Frame. Die  Gesamtzeit T für n Frames ist:?.