"arithmetic cyclic rotate"

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

“arithmetic cyclic rotate”
Hallo,

ich habe in einem short 5 Datenblöcke a 3 Bits gespeichert der Wert der höchsten Bits bleibt dabei immer frei.
Jetzt möchte ich den Datenblock mit den Bits 0,1,2 per cyclic rotate an die Stelle 12,13,14 schreiben und zwar ohne am 15. Bit etwas zu ändern. z.b.:
0100 0000 0000 0111 → 0111 1000 0000 0000

Eine Lösung wäre sowas in der Art:

short value = 42;
short tmp = value % 8;
value = (valule >> 3) + (tmp << 12);

Hat jemand vielleicht eine Idee wie und ob man das noch performanter machen kann - am besten ohne diese Hilfsvariable?
Bisher habe ich es mit rol / ror asm Befehlen bzw. arithmetic (vorzeichenerhaltende) shifts versucht, aber nichts führt zum Erfolg

Danke


Was genau meinst du mit performant? So alleine sind die Kosten von einer Berechnung egal. Wenn du das mit vielen Daten machst, willst du das vektorisieren und nicht die eine Operation optimieren.


Um mal eine Größenordnung zu nennen: ca 2^35 mal möchte ich das ausführen, auf teilweise voneinander abhängigen Daten. Weshalb es vermutlich schwierig ist, das Problem zu vektorisieren. Aber der Vektorisierungsgedanke ist gut, denn ich hatte den - vielleicht etwas voreilig - ziemlich schnell verworfen.


Hast du schon mal profiling gemacht? Ich würde mal vermuten dass dein Flaschenhals wo anders liegt. Source zum Programm magst du nicht zeigen nehme ich an?