假设您拥有一个uint64_t,只关心每个字节的高位比特。如下所示:
uint32_t:
0000 ... 1000 0000 1000 0000 1000 0000 1000 0000 ---> 0000 1111
有比以下方法更快的方式吗?
Aka 移位、掩码和为每个字节添加正确的位?这将编译成很多汇编代码,我正在寻找更快的方法...我使用的机器只有 SSE2 指令,我没有找到有用的 SIMD 操作。感谢您的帮助。
有比以下方法更快的方式吗?
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 移位、掩码和为每个字节添加正确的位?这将编译成很多汇编代码,我正在寻找更快的方法...我使用的机器只有 SSE2 指令,我没有找到有用的 SIMD 操作。感谢您的帮助。
pmovmskb
正好可以实现你想要的功能。如果我没记错,AVX2中会有一条整型指令也可以用来实现相同的操作(收集位,忘记助记符了)。 - harold