如何有效地交错 8 __int16 个数字的位?

How to efficiently interleave bits from 8 __int16 numbers?

我正在为空间索引构建 Morton 数,我有 8 个无符号的 16 位数字,它们将变成 __int128 数字。效率至关重要,因此天真的解决方案(遍历所有内容)或构建单独的 8 个 128 位数字太昂贵了。

我正在使用 GCC,目标机器是 64 位但不支持 BMI2。

如何加快计算速度?

如果您的机器是 x86 且支持 SSE2,使用 movmsk 指令有一个聪明的答案。 Google SSE2 bit matrix transpose 完整代码。