Supponiamo che tu abbia un uint64_t e che si preoccupi solo del bit di ordine elevato per ogni byte nel tuo uint64_t. In questo modo:Bits di ordine elevato: prendili e crea un uint64_t in un uint8_t
uint32_t: 0000 ... 1000 0000 1000 0000 1000 0000 1000 0000 ---> 0000 1111
Esiste un modo più veloce di:
return
(
((x >> 56) & 128)+
((x >> 49) & 64)+
((x >> 42) & 32)+
((x >> 35) & 16)+
((x >> 28) & 8)+
((x >> 21) & 4)+
((x >> 14) & 2)+
((x >> 7) & 1)
)
Aka spostamento x, mascherando e aggiungendo il bit corretto per ogni byte? Questo compilerà per un sacco di assembly e sto cercando un modo più veloce ... La macchina che sto usando ha solo fino alle istruzioni SSE2 e non sono riuscito a trovare utili SIMD ops.
Grazie per l'aiuto.
è possibile reinterpretare i singoli byte, eseguirne il ciclo e mascherare i singoli bit. non so se questo è più veloce, ma forse il compilatore può ottimizzare meglio. – PlasmaHH
Forse puoi prima mascherare con '0x8080808080808080' e poi moltiplicare per una costante particolare per mettere i bit in posizioni più convenienti, forse per l'uso in una tabella di ricerca. –
Hai bisogno del risultato, ovvero una sequenza di 8 bit come numero? O controllerebbe solo se i bit HO sono '1' o no, è sufficiente per te? – nullpotent