Multiplikation mit -1

Gast
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.
Gast
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.
Gast
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?
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.
Gast
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.
Gast
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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.