【发布时间】:2014-05-02 19:07:23
【问题描述】:
将两个字节打包成一个字节的最快方法是什么?我有大量的字节。每个字节代表一个不大于 15 的数字(4 位数字)。因此,我可以将两个字节打包成一个字节,将第一个字节放入高半字节,然后将后半字节放入低半字节。
我目前的方法是创建第二个数组,其大小是原始数组的一半,然后迭代原始数组并移动它和 |得到小食。这可行,但是需要一段时间,具体取决于数组的大小。数组从几千个条目到几百万个。这不是灾难性的,但任何优化都会有所帮助
【问题讨论】:
-
阵列有多大?因为它听起来就像你在描述唯一的算法(除了
|而不是& -
希望您意识到这也会使访问数组中的半字节所需的时间增加一倍(或更多)。
-
在我的机器上,使用 3000 万字节执行此操作所需的时间不到 33 毫秒。这真的是您遇到的性能问题吗? coliru.stacked-crooked.com/a/a0eba0e907b5696e
-
一种真正有效(0 个周期!)的方法是什么都不做;只需保持阵列解压即可。打包数组是否有一些可衡量的优势?
-
@MooingDuck:您可以通过这样做来修剪大约 10%:
unsigned lim = dest.size(); for(unsigned i=0, j=0; i<lim; ++i,j+=2) dest[i]=(data[j]<<4)|data[j+1];(请原谅丑陋的内联格式。)
标签: c++ assembly byte-shifting