【发布时间】:2021-01-05 16:43:59
【问题描述】:
假设您有一个 32 位无符号整数,其中字节的组织方式如下:a b c d。
以这种方式将这些字节扩展到 64 位无符号整数的最快方法是什么:
0 a 0 b 0 c 0 d?它适用于x86-64 架构。我想知道不使用特殊内在函数的最快方法,尽管这也很有趣。
(我说“最快”,但性能合理的紧凑型解决方案也不错)。
为需要上下文的人编辑。这似乎是一项非常简单的工作,只需移动一些字节,但它需要的指令比您想象的要多 (check this godbolt with optimizations)。因此,我只是想知道是否有人知道用更少的指令解决问题的方法。
【问题讨论】:
-
可能只是位移然后将它们异或在一起
-
您尝试过什么 - 请将您最好的代码编辑到您的问题中,并说明您认为它不是您需要的原因
-
来自
performance标签:“有关测量或改进代码和应用程序效率的问题。”你还没有什么可以衡量或改进的。除非你有东西,否则任何东西是最快的。闻起来像过早的优化。请出示您的代码 -
这适用于 16 位到 32 位的传播:
((x * 0x0101010101010101L & 0x8040201008040201L) * 0x0102040810204081L >> 49) & 0x5555。取自this thread。 -
选择你最喜欢的godbolt.org/z/3E7Gsa,但要考虑到在 x86_64 上,更少的指令并不一定意味着更快的执行时间。
标签: c++ c performance low-level-code