Hallo Forum, stehe gerade auf dem Schlauch: gibt es einen einfachen Weg, ein Byte "umzudrehen", so dass 128 -> 1 64 -> 2 32 -> 4 16 -> 8 ... Grund: Der "umgekehrte" PortA des Atmega16 und Designprobleme... Any hints? Gruss, Dirk
Hi,
Der C-Code ist nicht effektiv, Ich wollte damals nur keinen Assembler
mit einbinden.
uint8_t
mirrorbyte(uint8_t value) {
uint8_t ret=0, i;
for (i=0x80; i ; i>>=1) {
if (value & 0x01)
ret |= i;
value >>= 1;
}
return ret;
}
mfg
werner
Also XOR tuts nicht. Das dreht die Polarität um, aber nicht die Bitreihenfolge. Wie willst Du es denn machen? Mit Assembler oder in C? In Assembler würde ich 2 Register über das Carry rotieren lassen: Das Byte, was geändert werden soll, steht in R16, das Ergebnis später in R17: rol R16 ;Bit 7 von R16 ins Carry ror R17 ;Carry in Bit 7 von R17 .. und diese 2 Befehle 8 mal wiederholen. In C geht es natürlich auch ... Stefan
Hallo, danke fuer die Tipps. Ich habe noch folgendes ergooglet: n = ((n >> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa); n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc); n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0); n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00); n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000); Werde morgen mal schauen, was am schnellsten durchlaeuft. Gruss, Dirk
Die Diskussion hatten wir schon mal in de.sci.electronics.
Die Variante mit der Schleife ist die codesparendste. Für 8 bit ist
sie vermutlich auch mit die schnellste, für 32 bit braucht sie schon
recht lange.
Interessant ist dieser Trick aus der BSD fortune database:
n = ((n >> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa);
n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc);
n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0);
n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00);
n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000);
-- C code which reverses the bits in a word.
...nur falls es mal jemand für paar Bits mehr braucht. ;-)
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.