Forum: Mikrocontroller und Digitale Elektronik Multiplikation mit -1


von Multiplier (Gast)


Lesenswert?

moin,

mal eine dumme Frage:

wie rechenintensiv ist die Multiplikation mit (-1) für einen 
Mikrocontroller?

Es handelt sich um einen MSP430.

mfg

von AVerr (Gast)


Lesenswert?

Ohne speziell auf den MSP430 einzugehen:

Allgemein entspricht eine Multiplikation mit -1 dem toggle des 
Vorzeichen-Bits.
Für eine 8bit-Variable wäre das
1
var ^= 0b10000000;
und der Compiler sollte das von sich aus schon so hinbiegen ( oder auf 
die evtl. vorhandene Hardware-Multiplikation setzen ).
xor sollte auf einem aktuellen Controller nur 1 Takt brauchen, genaueres 
entnimmst du dem Instruction Set.

Kurz und knapp: eine Multiplikation mit -1 ist bei weitem nicht 
rechenintensiv.

von AVerr (Gast)


Lesenswert?

Nachtrag: Das Beispiel gilt natürlich nur für eine int8-Variable.
Da du keinen Datentypen genannt hast, kann man natürlich nur raten, wie 
es am Ende genau sein wird.

von Malte S. (maltest)


Lesenswert?

Allgemein entspricht eine Multiplikation mit -1 dem toggle des
Vorzeichen-Bits. Aber nicht bei so exotischen Kodierungen wie dem 
Zweierkomplement.

von DerDaniel (Gast)


Lesenswert?

Öhm such mal nach Zweierkomplement, dann wirst du feststellen das die 
Multiplikation mit -1 extrem simpel ist.

von Multiplier (Gast)


Lesenswert?

nunja,

wenn ich den XOR-Befehl nutze, ist mir auch klar, dass es schnell gehen 
wird.

Problem ist aber ja, dass ich einen Zeiger durch eine Tabelle laufen 
lasse, in der eine Menge Zahlen stehen.
Die Inhalte werden mit anderen Zahlen multipliziert. Folglich sieht 
meine C-Codezeile eben eher in der Form aus:

Ergebnis = Var_2 * -1;

Versteht ein Controller so etwas zur Laufzeit?

von Malte S. (maltest)


Lesenswert?

Das hier war natürlich gar nicht meins:
> Allgemein entspricht eine Multiplikation mit -1 dem toggle des
> Vorzeichen-Bits.

Nur das hier:
> Aber nicht bei so exotischen Kodierungen wie dem Zweierkomplement.

von Stefan E. (sternst)


Lesenswert?

Multiplier schrieb:
> wenn ich den XOR-Befehl nutze, ist mir auch klar, dass es schnell gehen
> wird.

Was weiter oben bezüglich Toggeln des Vorzeichenbits steht, das vergiss 
besser schnell wieder, das ist Unsinn.

Multiplier schrieb:
> Ergebnis = Var_2 * -1;
>
> Versteht ein Controller so etwas zur Laufzeit?

Man könnte natürlich auch einfach
1
Ergenis = - Var_2;
schreiben.
Bei jedem halbwegs vernünftigen Compiler sollte aber in beiden Fällen 
der gleiche Code erzeugt werden.

von DerDaniel (Gast)


Lesenswert?

Ich habe das sanfte Gefühl du verstehst nicht wie ein Controller 
arbeitet.

Deine Aussagen widersprechen sich, erst willst du mit -1, dann mit 
anderen Werten und dann wieder mit -1 Multiplizieren.

Schreib doch bitte einfach mal genau was du machen willst, auf welcher 
Platform usw.

von AVerr (Gast)


Lesenswert?

Malte S. schrieb:
>> Aber nicht bei so exotischen Kodierungen wie dem Zweierkomplement.
Das stimmt natürlich, und wenn ich mich recht entsinne waren 
int8-Variablen sogar im 2er-Komplement.
Nichtsdestrotrotz würde ich solche Feinheiten dem Compiler überlassen 
und einfach nur
1
var * -1
schreiben.

Multiplier schrieb:
> Versteht ein Controller so etwas zur Laufzeit?
Zur Laufzeit versteht er nur Maschinencode.
Aber da du deinen C-Code durch einen Compiler jagst, wird dieser die 
passenden Optinen wählen. Wenn du wissen willst, was am Ende daraus 
wurde, schau dir das Assembler-Listing an.

von Johann L. (radiostar)


Lesenswert?

AVerr schrieb:
> Das stimmt natürlich, und wenn ich mich recht entsinne waren
> int8-Variablen sogar im 2er-Komplement.

nicht nur die...

von c-hater (Gast)


Lesenswert?

AVerr schrieb:

> Allgemein entspricht eine Multiplikation mit -1 dem toggle des
> Vorzeichen-Bits.

Nein. Eine Multiplikation mit -1 entspricht dem Zweier-Komplement. Und 
das Zweier-Komplement ist ganz sicher nicht mit dem Toggle des 
Vorzeichenbits zu berechnen. Das würde z.B. bei 8 Bit zu dem verrückten 
Ergebnis führen, daß gelten müßte:

-128=0

(Weil:
-128=0b10000000
0   =0b00000000
)

Und das ist natürlich völliger Blödsinn.

von Tippgeber (Gast)


Lesenswert?

Alle Bits invertieren und anschließend noch eine 1 addieren

von Bernie (Gast)


Lesenswert?

@ tippgeber:

0b10000000 = -128  alle Bits invertieren:
0b01111111 = +127  anschließend noch eine 1 addieren:
0b10000000 = ????

von Stefan E. (sternst)


Lesenswert?

Bernie schrieb:
> 0b10000000 = -128  alle Bits invertieren:
> 0b01111111 = +127  anschließend noch eine 1 addieren:
> 0b10000000 = ????

Und was willst du uns damit sagen?
Der Wertebereich von signed-8-Bit im 2er-Komplement ist -128 bis 127. 
Ist doch logisch, dass man dann -128 nicht negieren kann.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.