修改数据流的最有效方法

时间:2010-10-24 21:16:48

标签: c++ binary-data

我有一个16位值的流,我需要调整每个样本的4个最低有效位。每个短片的新值都不同,但重复每个X短片 - 基本上用ID标记每个短片。

除了for-loop之外,还有什么比这更快的技巧吗?

更多详情 我正在将文件从一种格式转换为另一种格式。目前使用FILE *实现,但如果有用,我可以使用Windows特定的API。

[while data remaining]
{
   read X shorts from input
   tag 4 LSB's
   write modified data to output
}

除了批量操作之外,我想我一直在寻找关于最后4位的最佳方法的意见。

  1. 右移4,左移4,|在新值
  2. &安培;在我的零位,然后|在1位
  3. 模数16,添加新值
  4. 我们现在只支持win7(32或64),所以硬件就是人们为此选择的。

2 个答案:

答案 0 :(得分:3)

如果你正在努力,例如一个32位平台,你可以一次做2个。或者在现代x86等效产品上,您可以使用SIMD指令一次操作128位。

除此之外,没有比特错误的方法可以避免在整个数据集中循环,因为听起来你必须修改每个元素!

答案 1 :(得分:0)

最后4位的最佳方法是你的选择2:

int i;
i &= 0xFFF0;
i |= tag;

如果您事先知道标记值,那么长时间执行此操作会更快。 你可以在一个长度内记忆4条短裤,然后在4条短裤上进行与上述相同的操作:

long l;
l &= 0xFFF0FFF0FFF0FFF0;
l |= tags;

其中tags = (long) tag1 << 48 + (long) tag2 << 32 + (long) tag3 << 16 + (long) tag4; 如果你经常重复使用这个值标签,这是有道理的,而不是你必须为每组4个短裤不同地构建它。