Werte umdrehen und Bytegrenze füllen - wie?
-
Moinsen,
Newbie fragt sich (nämlich ich) wie man wohl in C aus 0x112233 auf effiziente Weise ein 0x00332211 macht?
-
In C++ würde ich das wohl mit reverse() zusammenbauen, in C müsstest du es wohl selber nachbauen.
(hmm, eventuell erfüllt auch man: swap32 deine Anforderungen)
-
unsigned dat = 0x112233; dat = ((dat << 24) >> 8)| (dat >> 16) | (((dat << 16) >> 24) << 8); //dat jetzt 0x00332211 - Berechnung zur Compilezeit, sehr effizient!
-
0x112233 -> 0x00332211
dat = ((dat << 24) >> 8)| (dat >> 16) | (((dat << 16) >> 24) << 8);
wenn das obere byte garantiert 0 ist und auch bleiben soll:
dat= (dat<<16&0xff0000)|(dat&0xff00)|(dat>>16)
ansonsten:
dat= (dat&0xff00ff00)|(dat<<16&0xff0000)|(dat>>16&0xff)
(4. und 2. byte behalten, 1. und 3. byte vertauschen)
nebenbei:
(((dat << 16) >> 24) << 8) = (dat & 0xff00)
-
hellihjb schrieb:
wenn das obere byte garantiert 0 ist und 0 bleiben soll:
dat= (dat<<16)|(dat&0xff00)|(dat>>16)
[/code]
dat = (dat<<16)|(dat&0xff00)|(dat>>16);
neuer Wert von dat ist jetzt 0x22332211
-
oh, das stammt allerdings - hast gut aufgepasst, nimm dir 'nen keks
hab' mich wohl zwei mal ueber die 0 gefreut, die nur einmal da ist...
der code-schnippsel ist korrigiert.