c++ - 高阶位——把它们变成 uint64_t 变成 uint8_t

标签 c++ c assembly bit-manipulation

假设您有一个 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/

相关文章:

c++ - 通过初始化列表调用另一个类的构造函数。有问题

visual-c++ - 内联汇编的初学者问题

c - (&) 的地址从符号表中获取值

c++ - OSX 64 位 C++ 逐行反汇编

c++ - 构造函数访问规则

c++ - 最大化平面值中的点

c++ - LNK2019 : Calling a function in WinMain

c - 在函数返回的指针处打印值

C++浮点精度

c - fopen、fprintf、fclose 的单行代码?