c – 高阶位 – 将它们置于uint8_t中并使其成为uint64_t

前端之家收集整理的这篇文章主要介绍了c – 高阶位 – 将它们置于uint8_t中并使其成为uint64_t前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设你有一个uint64_t,只关心uint64_t中每个字节的高位.像这样:

uint32_t的:
0000 … 1000 0000 1000 0000 1000 0000 1000 0000 —> 0000 1111

有更快的方法比:

  1. return
  2. (
  3. ((x >> 56) & 128)+
  4. ((x >> 49) & 64)+
  5. ((x >> 42) & 32)+
  6. ((x >> 35) & 16)+
  7. ((x >> 28) & 8)+
  8. ((x >> 21) & 4)+
  9. ((x >> 14) & 2)+
  10. ((x >> 7) & 1)
  11. )

又转移x,屏蔽,并为每个字节添加正确的位?这将编译到很多的程序集,我正在寻找一个更快的方式…我使用的机器只有SSE2指令,我没有找到有用的SIMD操作.

谢谢您的帮助.

解决方法

正如我在评论中提到的,pmovmskb做你想要的.以下是您可以如何使用它:

MMX SSE1:

  1. movq mm0,input ; input can be r/m
  2. pmovmskb output,mm0 ; output must be r

SSE2:

  1. movq xmm0,input
  2. pmovmskb output,xmm0

我抬头看新的方式

BMI2:

  1. mov rax,0x8080808080808080
  2. pext output,input,rax ; input must be r

猜你在找的C&C++相关文章