Einerkomplement: Unterschied zwischen den Versionen

Aus Foxwiki
Markierung: Ersetzt
Zeile 9: Zeile 9:
===== Weblinks =====
===== Weblinks =====
# https://de.wikipedia.org/wiki/Einerkomplement
# https://de.wikipedia.org/wiki/Einerkomplement
= TMP =
Das '''Einerkomplement''', auch '''(''b''−1)-Komplement''',<ref>Helmut Herold: ''Grundlagen der Informatik''. Pearson Studium, München 2007, ISBN 978-3-8273-7305-2, S. 59</ref> ist eine arithmetische Operation, die meist im [[Dualsystem]] angewendet wird. Dabei werden alle [[Ziffer]]n bzw. [[Bit]]s einer [[Dualsystem|Binärzahl]] (Dualzahl) invertiert, das heißt: Aus <code>0</code> wird <code>1</code> und umgekehrt. Das hat zur Folge, dass jede Ziffer der Binärzahl und ihre korrespondierende Ziffer des Einerkomplements sich „zu <code>1</code> ergänzen“, was der Operation ihren Namen gibt. Ist also <math>z</math> eine {{nowrap|<math>n</math>-stellige}} Binärzahl, dann ist ihr Einerkomplement
: <math>(2^n\!-\!1) - z,</math>
eine [[Subtraktion#Schriftliche Subtraktion|Subtraktion]], bei der keine [[Übertrag|Überträge]] vorkommen. Die Operation wird auch als [[Bitweiser Operator#NICHT|bitweise Negation]] bezeichnet und der Operator in verschiedenen [[Programmiersprache]]n als Tilde <code>~</code> notiert. Dabei wird die Zahl als [[Bitkette]] aufgefasst.
Eine Anwendung des Einerkomplements ist die gleichzeitige Manipulation einzelner Bits in einer Bitkette. Will man zum Beispiel in der Bitkette <code>Zahl</code> alle Bits löschen, die in der Bitkette <code>Maske</code> gesetzt sind, so kann man <code>Zahl</code> mit dem Einerkomplement von <code>Maske</code> bitweise [[Konjunktion (Logik)|UND-verknüpfen]], in [[C (Programmiersprache)|C]]-Syntax <code>Zahl &= ~Maske;</code>
Eine andere Anwendung ist die '''Einerkomplementdarstellung''', ein Verfahren zur [[Dualsystem|binären]] Darstellung negativer [[Ganzzahlen]]. Zwar lässt sie sich leicht beschreiben –&nbsp;das Komplement der Darstellung einer negativen Zahl ist die normale Binärdarstellung ihres Betrags&nbsp;–, aber die Implementation einer [[Arithmetisch-logische Einheit|Recheneinheit]] für so dargestellte Zahlen ist umständlich. Vorteile gegenüber der heute üblichen [[Zweierkomplement]]-Darstellung hat sie nur bei der ohnehin meist langsamen Division, bei der Multiplikation mit doppelt langem Ergebnis sowie bei der Bildung einfacher [[Prüfsumme]]n.
== Einerkomplementdarstellung ==
{| class="wikitable sortable float-right center" style="width: 20em; margin-left: 1em;"
|+ Vergleich der Darstellung eines [[Nibble]]s (4&nbsp;Bit) als vorzeichenloser Wert (0's), als Betrag und Vorzeichen (BuV), im Einerkomplement (1'S) und im [[Zweierkomplement]] (2'S)
|-
!colspan="2"| Gespeicherter Wert !!colspan="4"| Dezimale Interpretation<ref>{{Literatur |Autor=Herbert Schneider-Obermann |Titel=Basiswissen der Elektro-, Digital- und Informationstechnik |Auflage=1. |Verlag=Friedr. Vieweg & Sohn Verlag / GWV Fachverlage |Ort=Wiesbaden |Datum=2006 |ISBN=3-528-03979-5}}, Tabelle 2.1: ''Negative Zahlen im Dualsystem'' in Abschnitt 2.1.5 ''Darstellung negativer Zahlen im Dualsystem''</ref>
|-
! Bin !! Hex !! 0's !! BuV || 1'S !! 2'S
|-
| 0000 || 0 || 0 || 0 || 0 || 0
|-
| 0001 || 1 || 1 || 1 || 1 || 1
|-
| 0010 || 2 || 2 || 2 || 2 || 2
|-
| 0011 || 3 || 3 || 3 || 3 || 3
|-
| 0100 || 4 || 4 || 4 || 4 || 4
|-
| 0101 || 5 || 5 || 5 || 5 || 5
|-
| 0110 || 6 || 6  || 6 || 6 || 6
|-
| 0111 || 7 || 7 || 7 || 7 || 7
|-
| 1000 || 8 || 8 || −0 || −7 || −8
|-
| 1001 || 9 || 9 || −1 || −6 || −7
|-
| 1010 || A || 10 || −2 || −5 || −6
|-
| 1011 || B || 11 || −3 || −4 || −5
|-
| 1100 || C || 12 || −4 || −3 || −4
|-
| 1101 || D || 13 || −5 || −2 || −3
|-
| 1110 || E || 14 || −6 || −1 || −2
|-
| 1111 || F || 15 || −7 || −0 || −1
|}
Binäre Kodierungen vorzeichenbehafteter Ganzzahlen haben meist folgende Eigenschaften:
* verwendet wird eine konstante Anzahl ''n'' von [[Stellenwertsystem|Stellen]],
* das höchstwertige Bit ([[Bitwertigkeit|most significant bit]]) zeigt das [[Vorzeichen (Zahl)|Vorzeichen]] an: <code>0</code> für Plus, <code>1</code> für Minus,
* sie stimmen für positive Zahlen überein mit der vorzeichenlosen Darstellung, in der kleine Zahlen vorne mit Nullen ergänzt werden.
Unterschiede bestehen bei gesetztem höchstwertigen Bit. In diesem Fall ergibt sich bei der Einerkomplementdarstellung der Betrag durch Komplementbildung. Zum Beispiel erweist sich <code>1010</code> durch die führende <code>1</code> als negativ und der Betrag ist <code>~1010</code>, also <code>0101</code> = 5. Durch diese Definition ergeben sich folgende weitere Eigenschaften der Einerkomplementdarstellung:
* es existieren für die Zahl 0 zwei Darstellungen, +0 = <code>0000</code> und −0 = <code>1111</code>,
* positive und negative Zahlen reichen ''symmetrisch'' bis zum gleichen Betrag, hier 7 = <code>0111</code>.
Die Beispiele sind hier für eine Wortbreite von ''n'' = 4 bit angegeben. Für 8 und 16 bit ergeben sich die Maximalbeträge 127 bzw. 32767, allgemein <math>2^{n-1}-1.</math>
== Rechenoperationen und Probleme ==
Die in Einerkomplementdarstellung einfachste Rechenoperation ist die arithmetische Negation (unärer <code>-</code>-Operator). Es ist lediglich das bitweise Komplement zu bilden. Dadurch lässt sich die Subtraktion (binärer <code>-</code>-Operator) direkt auf die Addition zurückführen: 3 − 4 = 3 + (−4). Für die Durchführung dieser Addition ergibt ein für vorzeichenlose Zahlen konstruiertes [[Addierwerk]] das richtige Ergebnis:
            1011 (−4)
        +  0011 (+3)
Überträge 0011
          —————
        =  1110 (−1)
Nachteil der Einerkomplementdarstellung ist die Behandlung des Falls, wenn bei einer Operation die Null durchschritten wird. Beispiel: Beim Berechnen von −4 + 6 = +2 erscheint nach einer einfachen Binärzahl-Addition der beiden Einerkomplementdarstellungen zunächst ein falsches Zwischenergebnis:
  −4 + 6 = +2 führt zu
            1011
        +  0110
Überträge 1110
          —————
        =  0001 (Zwischenergebnis)
Die <code>0001</code> stünde für +1, nicht für +2. Damit ein korrektes Ergebnis erscheint, muss der am weitesten links stehende Übertrag ausgewertet werden (hier <code>1</code>) und ggf. das Ergebnis um 1 erhöht werden. Mit anderen Worten muss der Übertrag noch zum Zwischenergebnis hinzuaddiert werden:
          0001 (Zwischenergebnis)
        +    1 (Übertrag der vorhergehenden Operation)
          —————
        =  0010
Beim ersten Beispiel oben ist der Übertrag <code>0</code>, daher entspricht das Zwischenergebnis dort schon dem Endergebnis.
Ein weiterer Nachteil ist das Entstehen einer [[Redundanz (Informationstheorie)|Redundanz]]: Es existieren für die Null zwei Darstellungen: <code>0000</code> (+0) und <code>1111</code> (−0), siehe [[vorzeichenbehaftete Null]]. Zum einen wird bei einer begrenzten Anzahl von Bits nicht die maximale Ausdehnung des Betrags der darstellbaren Zahlen ausgenutzt. Der darstellbare Zahlenraum verringert sich um 1; da die Null zweimal vorhanden ist, fällt ein Datenwort für den Zahlenraum weg. Die Darstellung jeder anderen Zahl bleibt aber eindeutig. Im Beispiel hier mit 4 Bits werden mit den 2<sup>4</sup>&nbsp;=&nbsp;16 verschiedenen Bitkombinationen nur 15 verschiedene Zahlen (von −7 bis 7) dargestellt.
Beide geschilderten Probleme werden bei der Kodierung von Zahlen in der [[Zweierkomplement]]darstellung vermieden.
Das ''Hinzu<!-- Pleonasmus, „addieren“ geht nur mit „hinzu“ -->addieren des Übertrags'' verbessert die Empfindlichkeit einer einfachen [[Prüfsumme]] gegen mehrfache Bitfehler. So würde eine Prüfsumme mit der Überträge ignorierenden Modulo-Arithmetik mit einer Wahrscheinlichkeit von 50 % keinen Übertragungsfehler anzeigen, wenn das höchstwertige Bit oft falsch ist, z.&nbsp;B. konstant null. Das [[Transmission Control Protocol|TCP]] verwendet eine Prüfsumme in Einerkomplement-Arithmetik, die diesen Mangel nicht aufweist und deren effiziente Berechnung auf Hardware ohne Einerkomplement-Rechenwerk in <nowiki>RFC&nbsp;1071</nowiki><ref>{{RFC-Internet |RFC=1071 |Titel=Computing the Internet Checksum |Datum=}}</ref> beschrieben ist.
== Verallgemeinerung auf ''b''-adische Systeme ==
In einem {{nowrap|''b''-adischen}} System mit dem Standardziffernvorrat <math>\{0,1,\ldots,b\!-\!\!1\}</math> entspricht der binären Invertierung pro Ziffer <math>z</math> die Rechenvorschrift <math>\bar {z}~=~(b\!-\!\!1)-z</math>. Im Dezimalsystem mit {{nowrap|1=''b''=10}} muss also jede Ziffer von 9 abgezogen werden. Einige Autoren sprechen dann vom Neunerkomplement<ref>[https://www.rechnerlexikon.de/artikel/Neunerkomplement ''Neunerkomplement''.] Rechnerlexikon.de; abgerufen am 6. April 2015.</ref> und allgemein vom {{nowrap|(''b''−1)-Komplement.}} Beispielsweise ist das Neunerkomplement der dreistelligen Dezimalzahl <code>456<sub>dez</sub></code>
: <math>\begin{align}
\overline {456}_{\mathrm{dez}} & = ((9-4)(9-5)(9-6))_{\mathrm{dez}} \\
& = 543_{\mathrm{dez}} \\
& = 999_{\mathrm{dez}} - 456_{\mathrm{dez}}.
\end{align}</math>
Ist also <math>x</math> eine {{nowrap|<math>n</math>-stellige}} Dezimalzahl, dann ist ihr Neunerkomplement
: <math>(10^n\!-\!1) - x,</math>
eine [[Subtraktion#Schriftliche Subtraktion|Subtraktion]], bei der Überträge nicht vorkommen.


[[Kategorie:Computerarithmetik]]
[[Kategorie:Computerarithmetik]]
[[Kategorie:Zahlensystem]]
[[Kategorie:Zahlensystem]]
</noinclude>
</noinclude>

Version vom 15. Januar 2024, 15:46 Uhr

topic - Kurzbeschreibung

Beschreibung

Anhang

Siehe auch

Links

Weblinks
  1. https://de.wikipedia.org/wiki/Einerkomplement