16 bit und 32 bit Zahl mutlipilzieren
-
Hallo,
wie im Titel erwähnt, möchte ich eine 16 bit und eine 32 bit Zahl multiplizieren und zwar möglichst resourcenschonend. Da ich auf einem DSP (mit C) programmiere. Also bitte nicht mit Assembler antworten. Ich habe gehört, daß man die 32 bit Zahl in zwei 16 bit Zahlen aufspalten sollte und diese beide dann mit der ersten 16 bit Zahl multiplizieren. Das Ergebnis sollte schliesslich irgendwie "versetzt" addiert werden. So ähnlich wie man das mal irgendwann in der Grundschule gelernt hat.
Ist das wirklich das Beste? Und wie ist das mit dem Vorzeichen bzw. dem Übertrag? Könnte Hilfe gebrauchen..... danke wenn ich welchen bekommen könnte
-
bierbauch schrieb:
Hallo,
wie im Titel erwähnt, möchte ich eine 16 bit und eine 32 bit Zahl multiplizieren und zwar möglichst resourcenschonend. Da ich auf einem DSP (mit C) programmiere. Also bitte nicht mit Assembler antworten. Ich habe gehört, daß man die 32 bit Zahl in zwei 16 bit Zahlen aufspalten sollte und diese beide dann mit der ersten 16 bit Zahl multiplizieren. Das Ergebnis sollte schliesslich irgendwie "versetzt" addiert werden. So ähnlich wie man das mal irgendwann in der Grundschule gelernt hat.
Ist das wirklich das Beste? Und wie ist das mit dem Vorzeichen bzw. dem Übertrag?Mir scheint es am sinnvollsten, wenn du auf die Optimierungsqualitäten deines Compilers hoffst und die Zahlen einfach multiplizierst.
Wie man die Multiplikation einer 16Bit- und einer 32Bit-Zahl optimieren kann, hängt letztendlich vom Prozessor ab, und dann kann man gleich in Assembler programmieren. Aber wie bereits gesagt sollte dein Compiler das am besten können.Moritz
-
audacia schrieb:
Aber wie bereits gesagt sollte dein Compiler das am besten können.
Du solltest dir auf jeden Fall den erzeugten Code anschauen und prüfen, ob der den Fähigkeiten deines DSPs gerecht wird
-
danke schonmal!
Die Entwicklungsumgebung wurde zusammen mit dem DSP geliefert. Insofern sollte der Code eigentlich schon für den DSP optimiert werden können.
Aber was passiert mit dem Rechenergebnis? Ich meine, es muss ja nicht automatisch eine 32 bit Zahl sein. Könnte ja auch größer werden...oder???
-
na wenns größer wird, wirds eben umgewrappt. normal.
-
Es wird eine 48 Bit Zahl. In C macht es absolut keinen Sinn, da von Hand dran rumzupfuschen. Du schreibst einfach a = b*c; und fertig. Lediglich in Asm kannst du dir Gedanken machen, wie man sowas Ressourcenschonend selber macht. Ist auch nicht so schwer, so wie du es oben schon erwähnt hast (falls der Rechner nur 16 Bit Multiplikationen unterstützt).
-
"a = b*c;"
dann hat a trotzdem einen festen typen mit fester bitzahl.
aber ja, bei 16*32 bit können maximal 48 bit rauskommen (2**16 * 2**32 = 2**(16+32))