【发布时间】:2012-08-29 15:24:26
【问题描述】:
假设您有一个 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 操作。
感谢您的帮助。
【问题讨论】:
-
您可以重新解释单个字节,遍历它们并屏蔽单个位。不知道这是否更快,但也许编译器可以更好地优化它。
-
也许您可以先用
0x8080808080808080进行掩码,然后乘以一个特定的常数,将这些位放在更方便的位置,也许可以在查找表中使用。 -
是否需要结果,即8位序列作为数字?还是只检查 HO 位是否为
1就足够了? -
是的,
pmovmskb完全符合您的要求。 IIRC 在 AVX2 中将有一个整数指令,您可以使用它来做同样的事情(收集位,忘记助记符)。 -
@AndyRoss 我正在写它,花了一段时间,因为我真的想把新指令放在那里:)
标签: c++ c assembly bit-manipulation