Der Einfachheit halber nehmen, ich bin ein 32-Bit-Little-Endian-Prozessor und haben die folgenden 4-Byte-Puffer erklärt:Bitshifting-Bytes in 32/64-Bit-Mengen effizient?
unsigned char buffer[] = { 0xab, 0xcd, 0xef, 0x46 };
Sagen wir, mein Ziel jedes Byte in dem Puffer zu bitweise Verschiebung nach links ist um 4 Bits. Das heißt, ich möchte die Pufferwerte wie folgt transformieren: { 0xbc, 0xde, 0xf4, 0x60 }
. Zur Durchführung einer solchen Transformation könnte schreiben einen Code wie:
for (int i = 0; i < 3; ++i)
{
buffer[i] <<= 4;
buffer[i] |= (buffer[i + 1] >> 4);
}
buffer[3] <<= 4;
Während dies funktioniert, würde ich viel lieber alle 4 Bytes verschieben gleichzeitig mein Prozessor native 32-Bit-Register mit:
unsigned char buffer[] = { 0xab, 0xcd, 0xef, 0x46 };
unsigned int *p = (unsigned int*)buffer; // unsigned int is 32 bit on my platform
*p <<= 4;
Die oben Snippet führt erfolgreich eine Verschiebung durch, aber nicht auf die Art, nach der ich suche. Es scheint, dass, da ich Puffer zu einem unsigned Int Casting bin, das Register geladen wird (Little-Endian) mit dem Wert 0x46efcdab
(anstelle von 0xabcdef46
). Folglich führt das Ausführen der 4-Bit-Linksverschiebung zu 0xb0dafc6e
anstelle von 0xbcdef460
.
Neben dem Austauschen von Bytes vor der Verschiebung (z. B. htonl
et al.) Gibt es irgendwelche Tricks für die effiziente Verschiebung von Bytes in der Art, die ich suche?
Vielen Dank im Voraus für Ihre Erkenntnisse.
@ user3386109, ja, es ist x86 – digitale
Dann stimme ich mit Nneonneo die Antwort.Der Compiler implementiert "htonl" als eine einzelne Anweisung (auf der richtigen Optimierungsstufe). Nicht sicher, was das Minimum ist, aber "-O3" funktioniert definitiv. – user3386109
Wenn Sie das Fixed mit den C-Typen verwendet hätten, hätten Sie die ganze Menge an Annahmen verschonen können, wie groß 'unsigned' auf Ihrer Plattform ist, usw. Siehe 'stdint.h', dafür sind sie da. Und wenn Sie Daten serialisieren möchten, verwenden Sie die richtige Bitverschiebung/Maskierung, nicht Casting, Ihr Code ruft undefiniertes Verhalten auf. – Olaf