假设您有一个 uint64_t,并且只关心 uint64_t 中每个字节的高位。像这样:
uint32_t: 0000 ... 1000 0000 1000 0000 1000 0000 1000 0000 ---> 0000 1111
有没有比以下方法更快的方法:
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)
)
也就是移位 x、屏蔽并为每个字节添加正确的位?这将编译成很多程序集,我正在寻找一种更快的方法......我使用的机器只有 SSE2 指令,我找不到有用的 SIMD 操作。
感谢您的帮助。
最佳答案
正如我在评论中提到的,pmovmskb
可以满足您的需求。以下是您可以如何使用它:
MMX + SSE1:
movq mm0, input ; input can be r/m
pmovmskb output, mm0 ; output must be r
SSE2:
movq xmm0, input
pmovmskb output, xmm0
我用新的方式寻找
体重指数 2:
mov rax, 0x8080808080808080
pext output, input, rax ; input must be r
关于c++ - 高阶位——把它们变成 uint64_t 变成 uint8_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12181352/