Wie extrahiere ich die höchstwertigen Bits aus jedem Byte einer 64-Bit-Ganzzahl in eine 8-Bit-Bitmaske?
Posted: 16 Jan 2025, 02:31
Gegeben eine 64-Bit-Ganzzahl, möchte ich alle höchstwertigen Bits ihrer acht Bytes extrahieren und sie in eine Acht-Bit-Bitmaske schreiben. Das heißt, ich möchte effektiv eine Funktion auto extract_msbs(uint64_t mask) -> uint8_t; implementieren, wobei zum Beispiel
Übrigens ist dies genau die Operation, die vom _mm_movemask_epi8 SSE2-Intrinsic ausgeführt wird, aber ich konnte nicht herausfinden, wie das implementiert wurde.
Die Idee, die ich zu entwickeln versucht habe, besteht darin, die anfängliche 64-Bit-Maske mit einer Konstante zu multiplizieren, die alle führenden Bits in den höchstwertigen 8 Bytes sammelt, und dann um 56 nach rechts zu verschieben. Ich konnte nicht die richtige Konstante finden (meine ursprüngliche Idee war 0x0102040810204081ULL, aber das ergibt das falsche Ergebnis von 10000001 statt 00000001 für 0x0000000000000080).
Kann jemand einen effizienten Weg finden, dies zu tun?
Code: Select all
extract_msbs(0x'00110010'00010111'00000010'11001110'00100000'11001101'01011000'01111011) = 00010100
Die Idee, die ich zu entwickeln versucht habe, besteht darin, die anfängliche 64-Bit-Maske mit einer Konstante zu multiplizieren, die alle führenden Bits in den höchstwertigen 8 Bytes sammelt, und dann um 56 nach rechts zu verschieben. Ich konnte nicht die richtige Konstante finden (meine ursprüngliche Idee war 0x0102040810204081ULL, aber das ergibt das falsche Ergebnis von 10000001 statt 00000001 für 0x0000000000000080).
Kann jemand einen effizienten Weg finden, dies zu tun?