// 00111111 00111111 00111111 00111111
// 000000 001111 111122 222222
void pack6(
register unsigned char o,
register unsigned char const *i,
unsigned char const *end
)
{
while(i!=end)
{
*o++ = *i << 2u | *(i+1) >> 4u; ++i;
*o++ = (*i & 0xfu) << 4u | *(i+1) >> 2u; ++i;
*o++ = (*i & 0xfcu) << 6u | *(i+1) ; i+=2;
}
}
fehl, wenn Eingabelänge ist nicht teilbar durch 4 hoch 2 Bits von Eingangs Geht davon sind gleich Null. Vollständig portabel. Liest 4 Eingabebytes 6 Mal, also 50% Ineffizienz bei Lesevorgängen, jedoch können der Prozessorcache und der Compileroptimierer helfen. Der Versuch, eine Variable zu verwenden, um das Lesen zu speichern, kann kontraproduktiv sein, nur eine tatsächliche Messung kann dies erkennen.
6 Bits * 4 = 24 Bits = 3 Bytes. Schreiben Sie Code, um mit vier Bytes gleichzeitig umzugehen, und machen Sie mit jedem das Richtige, und Sie sind auf einem Gewinner. –
Was ist Ihre Systemwortgröße? Was ist Ihr Systemprozessor? "So schnell wie möglich" hängt vom systemspezifischen Verhalten ab, z. B. welche Operationen die meiste Parallelität und die geringste Menge an Code zur Folge haben. –
Vorausgesetzt, dass einige Ihrer 6-Bit-Werte Byte-Grenzen im Ergebnis überlappen, kommt hier die Endianess zum Tragen. Welchen Endian willst du? –