gpt4 book ai didi

c++ - 将两个半字节打包成一个字节的最快方法

转载 作者:太空狗 更新时间:2023-10-29 20:59:56 24 4
gpt4 key购买 nike

将两个字节打包成一个字节的最快方法是什么?我有一大堆字节。每个字节代表一个不大于 15(4 位数字)的数字。因此,我可以将两个字节打包成一个字节,将第一个字节放入高半字节,将后面的字节放入低半字节。

我目前的方法是创建第二个数组,其大小是原始数组的一半,然后遍历原始数组并移动它 |得到一点点。这可行,但需要一段时间,具体取决于数组的大小。数组从几千个条目到几百万个。这不是灾难性的,但任何优化都会有所帮助

最佳答案

如果您的数组很大,这显然需要一段时间 - 您需要遍历所有内容。

我要做的第一件事是创建一个从两个字节到一个字节的查找表,这样您就不需要移动和/或 - 获取接下来的两个字节,查找它们的偏移量并获得结果字节。

这个查找表应该有 2^12 个条目(你只需要从最高有效字节起 4 个字节),并且很好地适合你的 CPU 的 L1 缓存。它可能比 shift-and-or 更快。

另一方面,如果您一次加载 8 个字节(在 64 位 CPU 上,现在都是这样),您可以将其转换为 4 个字节并存储它们。您将能够对此进行并行化(将数组分成 4 部分,并让每个核心处理一个部分)。

如果有一条指令从 64 位寄存器中取出字节 0、2、4 和 6 并将它们放入 32 位寄存器中,那么您就完成了。

更新:您在问题中提到您有几百万字节。在那种情况下,不要打扰。高度优化的汇编和 C 中的简单实现之间的区别是不值得的。只需一次加载两个字节的数据,将和/或两个半字节移位到一个字节中并存储在目标数组中。处理 1MB 的数据应该是即时的。

关于c++ - 将两个半字节打包成一个字节的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23435258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com