加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:14:51 所属栏目:百科 来源:网络整理
导读:假设你有一个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)+ (
假设你有一个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

我抬头看新的方式

BMI2:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读