Hallo, gibt es eine Möglichkeit, ein Bitmuster zum Beispiel: 0b11110000 welches man in einem Ring immer um die Stelle x verschieben kann? 0b11110000 << 1 = 0b11100001 ob11110000 << 3 = 0b10000111 0b11110000 >> 1 = 0b01111000
Es handelt sich dabei um die zyklische Verschiebung.
1 | // links
|
2 | uint8_t x = 0b11110011; |
3 | x = (x<<7)|(x>>1); |
4 | |
5 | // rechts
|
6 | x = (x<<1)|(x>>7); |
Wenn der Controller Rotations-Befehle kennt (wie z.B. die 8051) oder einen Barrel-Shifter hat, wäre ein Blick in die intrins.h interessant. Beim 8051 werden die RL- und RR-ASM-Befehle in C über die Funktionen
1 | unsigned char _cror_(unsigned char Value, unsigned char RotationNr); |
2 | unsigned char _crol_(unsigned char Value, unsigned char RotationNr); |
aufgerufen. Allerdings verliert man dadurch die Portabilität des Programms auf andere Controller. Mit etwas Glück hat der Compiler aber eine gute Optimierung (bzw. passende Peepholes) und setzt auch die zuletzt genannten C-Konstrukte in wenige ASM-Befehle für Rotation um.
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.