Wie extrahiere ich die höchstwertigen Bits aus jedem Byte einer 64-Bit-Ganzzahl in eine 8-Bit-Bitmaske?C++

Programme in C++. Entwicklerforum
Guest
 Wie extrahiere ich die höchstwertigen Bits aus jedem Byte einer 64-Bit-Ganzzahl in eine 8-Bit-Bitmaske?

Post by Guest »

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

Code: Select all

extract_msbs(0x'00110010'00010111'00000010'11001110'00100000'11001101'01011000'01111011) = 00010100
Ü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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post