moin, mal eine dumme Frage: wie rechenintensiv ist die Multiplikation mit (-1) für einen Mikrocontroller? Es handelt sich um einen MSP430. mfg
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.
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.
Allgemein entspricht eine Multiplikation mit -1 dem toggle des Vorzeichen-Bits. Aber nicht bei so exotischen Kodierungen wie dem Zweierkomplement.
Öhm such mal nach Zweierkomplement, dann wirst du feststellen das die Multiplikation mit -1 extrem simpel ist.
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?
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.
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.
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.
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.
AVerr schrieb: > Das stimmt natürlich, und wenn ich mich recht entsinne waren > int8-Variablen sogar im 2er-Komplement. nicht nur die...
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.
@ tippgeber: 0b10000000 = -128 alle Bits invertieren: 0b01111111 = +127 anschließend noch eine 1 addieren: 0b10000000 = ????
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.