www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einerkomplement Multiplikation


Autor: Zu blöd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hat von euch schon mal jemand 2 Binärzahlen im Einerkomplement 
multipliziert? Ich bin wohl zu blöd dafür ;-). Kann mir jmd einen Tipp 
geben, bzw. einen Link?

bsp
7 also 0111 * -3 also 100

ergibt nach meiner rechnung 011100 (nach links shiften, also 2 0en 
anhängen)
was so gar nichts mit dem gewünschten ergebniss von 101010 (1+4+16, 0er 
zählen) zu tun hat.

Was mach ich falsch?
Positiv und im 2er Komplement gibt es keine Probleme.

Mfg

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
- 3 -> 1111 1101
  7 -> 0000 0111
*
-----------------
-21 -> 1110 1001
=================

Autor: Zu blöd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, aber du rechnest im 2er Komplement. Probeme treten nur im wohl 
weniger verbreitetem Einerkomplement auf.

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu blöd schrieb:
> Danke, aber du rechnest im 2er Komplement. Probeme treten nur im wohl
> weniger verbreitetem Einerkomplement auf.
 Eben deswegen wird das 2er Komplement benutzt. Weil man da einfach 
rechnen kann. Im 1er komplement geht das nicht.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu blöd schrieb:
> Positiv und im 2er Komplement gibt es keine Probleme.
Dein Problem ist: im Einerkomplement gibt es schon 2 Nullen.
z.B. für 8 Bit
 0 = 00000000
und
-0 = 11111111
Und wenns da schon klemmt, wie wird es dann wohl mit den anderen Zahlen 
weitergehen?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Darf man fragen, wozu man das braucht?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute, dass jemand kreativ genug war, eine Hausaufgabe zu stellen, 
für die man nicht an jeder Strassenecke einen Javascript-Rechner findet.

Der in der Branche recht bekannt Seymour Cray fand das Einerkomplement 
offenbar ganz praktisch. Eine Begründung dafür ist mir aber noch nicht 
begegnet.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zahlenbreite 4 Bit.

- 3        1100
  7        0111
*
---------------
 84    101 0100
>>
>>
---------------
 21      1 0101
===============

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> - 3        1100
>   7        0111
> ---------------
>  21      1 0101
-3 * 7 gibt aber -21 ... :-/

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ja der Witz an der Rechnung ;)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie steh ich auf dem Schlauch.

Wie rechnet ihr da die Multiplikation?

Ich kenn das eigentlich nur so, dass man zu Beginn einer Multiplikation 
erst mal alle beiden Teilnehmer positiv macht und sich merkt ob einer 
oder alle beide Position waren. Das geht ganz einfach, weil man einfach 
nur ein 'Eregebnis muss negativ sein Bit' toggeln muss.
Dann wird mit den positiven Zahlen multipliziert und zum Schluss das 
Ergebnis möglicherweise noch negiert.


Aber diese 'Zusammenfassung der Multiplikationen' die bisher präsentiert 
wurden, die erinnern mich an die Mathematik Texte des Altertums, bei 
denen man auch mehr zwischen den Zeilen lesen muss als man sie verstehen 
kann.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... Mathematik Texte des Altertums ...

Wir sind eben große Verehrer des Muhammad ibn Musa, Abu Dscha'far 
al-Chwarizmi :)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> Das ist ja der Witz an der Rechnung ;)
Der Witz ist zu gut versteckt, ich finde ihn nicht... :-/
Erklär mir das mal mit 8 Bit:
            1111 1100  |   -3
*           0000 0111  |  * 7
= 0110 1101 0100 0100  |

Und wie komme ich jetzt von dem Ergebnis auf
1111 1111 1110 1010 = -21  (Einerkomplement)
oder gar
0000 0000 0001 0101 = 21

Autor: Zu blöd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Ich vermute, dass jemand kreativ genug war, eine Hausaufgabe zu stellen,
> für die man nicht an jeder Strassenecke einen Javascript-Rechner findet.

so in die Richtung. aber auch keine Erklärungen

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... Erklär mir das mal mit 8 Bit: ...

Zahlenbreite 8 Bit.

- 3          1111 1100
  7          0000 0111
*
----------------------
 1764    110 1110 0100
   21           1 0101
/
----------------------
   84
>>
>>
----------------------
 21             1 0101
======================

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> - 3          1111 1100
>   7          0000 0111
> *
> ----------------------
>  1764    110 1110 0100
Wie das?
252 * 7 = 1764. Soweit klar...

Aber das sieht mir aus wie "am eigenen Haar aus dem Sumpf ziehen":
> ----------------------
>  1764    110 1110 0100
>    21           1 0101
> /
> ----------------------
>    84
Woher kommt jetzt hier "geteilt durch 21"?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... Woher kommt jetzt hier "geteilt durch 21"? ...


Von deiner Forderung von 4- auf 8-Bit "umzusteigen".

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> Von deiner Forderung von 4- auf 8-Bit "umzusteigen".

Sorry aber das kapier ich nicht. Soll das heissen, daß Du abhängig von 
der Zahlenbreite eine Korrekturdivision und dann noch ein Shift 
brauchst?

Kannst Du dann auch eine allgemeingültige Regel ableiten.
Irgendwie gehts mir mindestens wie Karl Heinz.
Alchemie im binären :-)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

> Ich kenn das eigentlich nur so, dass man zu Beginn einer Multiplikation
> erst mal alle beiden Teilnehmer positiv macht

Mindestens bei der Zweierkomplementmultiplikation kannst du dir diesen 
Schritt sparen, bei richtiger Vorzeichenbehandlung der Teilprodukte ist 
das überflüssig.

Erst recht wenn, wie in C, nur die untere Hälfte des Produkts verwendet 
wird - in dem Fall unterscheidet sich das Ergebnis bei Multiplikation 
mit und ohne Vorzeichen überhaupt nicht.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was jeder hier hoffentlich weiss: Dass die Multiplikation nach dem 
allseits bekannten Schema der schriftlichen Multiplikation in jeder 
Basis und jeder Zahlendarstellung (im Stellenwertsystem natürlich - die 
Römer hatte damit mehr Ärger) gleich funktioniert. Egal ob binär oder 
dezimal, egal ob Einer- oder Zweierkomplement oder Sign/Magnitude (wie 
in der IEEE Fliesskommadarstellung).

Man muss allerdings die Zwischenschritte auch entsprechend dieser 
Zahlendarstellung durchführen. Dabei kommen ja 2 verschiedene 
Teiloperationen vor: Die Multiplikation mit der Basis, also eine 
Verschiebung nach links, und die Addition. Beides sollte 
selbstverständlich im Einerkomplement durchgeführt werden - wo das in 
beiden Fällen ein bischen anders funktioniert als im Zweierkomplement.

Womit von dieser Hausaufgabe erst einmal die Fragen zu lösen wären, wie 
Addition und Linksschiebeoperation im Einerkomplement funktionieren. 
Bischen was solltest du schon noch selber machen ;-).

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... Alchemie im binären :-) ...

Da ist so nicht korrekt. Es handelt sich eher um eine Mischung aus 
al-Chwarizmi & Nasir ad-Din.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu blöd schrieb:

> Was mach ich falsch?

Um festzustellen was du falsch machst müsste man erst einmal sehen was 
du überhaupt machst. Also solltest du schön fein säuberlich alle 
Zwischenschritte aufführen. Deine Prosa ist hoch dubios und manche 
ausgelassenen Selbstverständlichkeiten sind vielleicht keine.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Positiv und im 2er Komplement gibt es keine Probleme.
Demnach würde ich einfach so vorgehen: wenn das MSB gesetzt ist, habe 
ich eine negative Zahl. Die wird dann erst mal bitweise invertiert und 
dann 2 positive Zahlen multipliziert. Ob das Ganze abschliessend nochmal 
invertiert wird, entscheidet das XOR der beiden MSBs...

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre nur die Frage, ob man sich bei einer Hausaufgabe einen Gefallen 
tut, wenn man den casus cnactus der Frage derart schnöde umschifft. 
Andererseits machte es der Multiplier der CDC6600 ebenfalls so ;-).

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder halt bei negativen Zahlen eins abziehen, um ins
Zweierkomplement zu kommen, und dann wie gehabt...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Andererseits machte es der Multiplier der CDC6600 ebenfalls so ;-).

Mann, hast du moderne Kisten!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Natürlich könnte man eine Wahrheitstabelle aufstellen und irgend ein 
Mintermverfahren anwenden...
Ich finde es aber blöde, dass z.B. für 0011b * 0011b
das selbe herauskommen muß wie für 1100b * 1100b  (nämlich 1001)

Oder (binär) 0110*0110 = 1001*1001 = 1100
     (dez)     6 * 6   = -6  * -6  = 12

Das sieht schon auf den ersten Blick irgendwie aufwendig aus...  :-o

> Oder halt bei negativen Zahlen eins abziehen, um ins
> Zweierkomplement zu kommen, und dann wie gehabt...
Der Ansatz ist ähnlich pragmatisch wie meiner (eher noch brutaler):
Erst wandeln ins Zweierkomplement, dann Rechnen, dann zurückwandeln...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Natürlich könnte man eine Wahrheitstabelle aufstellen und irgend ein
> Mintermverfahren anwenden...
> Ich finde es aber blöde, dass z.B. für 0011b * 0011b
> das selbe herauskommen muß wie für 1100b * 1100b  (nämlich 1001)
>
> Oder (binär) 0110*0110 = 1001*1001 = 1100
>      (dez)     6 * 6   = -6  * -6  = 12

Ähm.
6 * 6 ist aber 36

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Ähm.
> 6 * 6 ist aber 36
Echt jetzt? Es ist schon spät... ;-)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:

>> Andererseits machte es der Multiplier der CDC6600 ebenfalls so ;-).
>
> Mann, hast du moderne Kisten!

So arg viel moderner wird's nicht, wenn du mal nach Hardware mit Rechung 
in  Einerkomplement suchst. Dafür gibt's von der ein Buch, in dem der 
interne Aufbau ziemlich detailfreudig beschrieben ist. Zwar mit 
gewöhnungsbedürftiger Symbolik, aber für Freunde von Hardcore ziemlich 
interessant.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Karl heinz Buchegger schrieb:
>> Ähm.
>> 6 * 6 ist aber 36
> Echt jetzt? Es ist schon spät... ;-)

... und du brauchst das Geld :-)

(Allerdings ist aber auch -6 * -6 gleich 36)

Und ihr könnt mich schlagen, wenn ich
1111001  mal  1111001   (jeweils -6 im 2-er Komplement, dargestellt mit 
7 Bit) rechne, dann kommt bei mir alles mögliche raus, nur nicht 36

Ich kann das hier
>> Ich kenn das eigentlich nur so, dass man zu Beginn einer Multiplikation
>> erst mal alle beiden Teilnehmer positiv macht
>
> Mindestens bei der Zweierkomplementmultiplikation kannst du dir diesen
> Schritt sparen, bei richtiger Vorzeichenbehandlung der Teilprodukte ist
> das überflüssig.

ums Verrecken nicht nachvollziehen.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Ähm.
> 6 * 6 ist aber 36

nimm es ihm nicht übel, sein Rechner ist nicht mehr der Jüngste.

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Echt jetzt? Es ist schon spät... ;-)

Sendest Du heute aus Australien? :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

> Und ihr könnt mich schlagen, wenn ich
> 1111001  mal  1111001   (jeweils -6 im 2-er Komplement, dargestellt mit
> 7 Bit) rechne, dann kommt bei mir alles mögliche raus, nur nicht 36

mag vielleicht auch daran liegen, dass -6 eben nicht 1111001 im 2-er 
Komplement ist :-)

Grrrrr, also nochmal. Ich hab jetzt schon fast 2 Seiten mit binären 
Multiplikationen vollgekritzelt :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Karl heinz Buchegger schrieb:
>
>> Und ihr könnt mich schlagen, wenn ich
>> 1111001  mal  1111001   (jeweils -6 im 2-er Komplement, dargestellt mit
>> 7 Bit) rechne, dann kommt bei mir alles mögliche raus, nur nicht 36
>
> mag vielleicht auch daran liegen, dass -6 eben nicht 1111001 im 2-er
> Komplement ist :-)
>
> Grrrrr, also nochmal. Ich hab jetzt schon fast 2 Seiten mit binären
> Multiplikationen vollgekritzelt :-)



Tatsache: Jetzt hab ichs tatsächlich rausgekriegt. Muss mich wohl vorher 
irgendwo beim Untereinanderschreiben verhaut haben :-) Nachdem ich dann 
am karierten Papier die Zahlen sauber untereinander geschrieben habe, 
kommt auch bei -6 * -6 tatsächlich 36 raus (im 2-er Komplement)

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bevor ich mich jetzt hinlege (es ist schon spät) möchte ich auf meine 
drei Beispiele (siehe oben) verweisen, die einwandfrei funktionieren - 
sei es das 2er - oder das 1er Komplement.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> möchte ich auf meine drei Beispiele (siehe oben) verweisen,
Du bist noch die Erklärung für die 21 schuldig... ;-)
Beitrag "Re: Einerkomplement Multiplikation"

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
[...]
Korektur: Das funktioniert nur wenn die rechte Seite positiv ist. Die 
linke Seite darf negativ sein, wenn man das Vorzeichen korrekt mitnimmt.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

> ums Verrecken nicht nachvollziehen.

Wenn beide Seiten negativ sein können (Zweierkomplement):
http://de.wikipedia.org/wiki/Booth-Algorithmus
So wird das in Hardware-Multiplizierern implementiert.

Autor: Zu blöd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi.

A. K. schrieb:
> Womit von dieser Hausaufgabe erst einmal die Fragen zu lösen wären, wie
> Addition und Linksschiebeoperation im Einerkomplement funktionieren.
> Bischen was solltest du schon noch selber machen ;-).

Ich hab hier sicher nicht gefragt, weil ich zu faul bin. Habe lange 
damit gewartet und wollte selber drauf kommen. Die genannten Regeln 
dafür glaube ich zumindest zu kennen (mit 1 auffüllen, übertrag 
dazuaddieren)

Ich hab jetzt zwar immer noch nicht 7*-3 aber -3*7 rechnen können.

 100*0111
 --------
  000000
  110011
  111001
  111100
  ------
10101000 //+übertrag
 +    10
 --------
  101010 = -21 (0er zählen)

Schreibt man die 000000 als 111111 passt auch die mit 1 auffüllen Regel 
beim Shiften wieder.

Wie 7*-1 geht kann ich mir immer noch nicht erklären. Wär aber wirklich 
interessant.

MfG

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu blöd schrieb:

> Ich hab jetzt zwar immer noch nicht 7*-3 aber -3*7 rechnen können.

Ich auch nicht ;-), hatte mich ja später korrigiert. Bei der linken 
Seite funktioniert das so, aber ob es bei negativen Werten auf der 
rechten Seite einen eleganteren Weg als den der Negation gibt weiss ich 
grad auch nicht. Wobei eine Negation bei Einerkomplement weit weniger 
Aufwand als bei Zweierkomplement darstellt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.